這篇文章主要介紹了JS函數節流和函數防手震問題分析,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
#問題1:如果實現了dom拖曳功能,但是在綁定拖曳事件的時候發現每當元素稍微移動一點便觸發了大量的回調函數,導致瀏覽器直接卡死,這個時候怎麼辦?
**問題2:**如果給一個按鈕綁定了表單提交的post事件,但是使用者有些時候在網路狀況極差的情況下多次點擊按鈕造成表單重複提交,如何防止多次提交的發生?
為了回應如上場景,便出現了函數防手震和函數節流兩個概念,總的來說:
這兩個方法是在時間軸上控制函數的執行次數。
函數防手震(debounce)
#概念: 在事件觸發n秒後再執行回調,如果在這n秒內又被觸發,則重新計時。
生活中的實例: 如果有人進電梯(觸發事件),那電梯將在10秒鐘後出發(執行事件監聽器),這時如果又有人進電梯了(在10秒內再次觸發該事件),我們又得等10秒再出發(重新計時)。
函數節流(throttle)
#概念: 規定一個單位時間,在這個單位時間內,只能有一次觸發事件的回呼函數執行,如果在同一個單位時間內某事件被觸發多次,只有一次能生效。
生活中的實例: 我們知道目前的一種說法是當1 秒內連續播放24 張以上的圖片時,在人眼的視覺中就會形成一個連貫的動畫,所以在電影的播放(以前是,現在不知道)中基本上是以每秒24 張的速度播放的,為什麼不100 張或更多是因為24 張就可以滿足人類視覺需求的時候,100 張就會顯得很浪費資源。
分析圖
假設,我們觀察的總時間為10秒鐘,規定1秒為一次事件的最小間隔時間。
如果觸發事件的頻率是0.5s/次,那麼函數防手震如圖
因為總是沒法等一秒鐘就被再次觸發了,所以最終沒有一次事件是成功的。
函數節流如圖
因為控制了最多一秒一次,頻率為0.5s/次,所以每一秒鐘就有一次事件作廢。最終控製成1s/次
如果觸發事件的頻率是2s/次,那麼
函數防手震如圖
因為2s/次
已經大於了規定的最小時間,所以每計時兩秒便觸發一次。
函數節流如圖
同樣, 2s/次 大於了最小時間規定,所以每一次觸發都生效。
應用場景
對於函數防手震,有以下幾個應用程式場景:
為按鈕加函數防手震防止表單多次提交。
對於輸入框連續輸入進行AJAX驗證時,用函數防手震能有效減少請求次數。
判斷scroll 是否滑到底部, 捲動事件函數防手震
總的來說,適合多次事件一次回應的狀況
對於函數節流,有以下幾個場景:
遊戲中的刷新率
DOM元素拖曳
Canvas畫筆功能
總的來說,適合大量事件按時間做平均分配觸發。
原始碼
函數防手震:
function debounce(fn, wait) { var timer = null; return function () { var context = this var args = arguments if (timer) { clearTimeout(timer); timer = null; } timer = setTimeout(function () { fn.apply(context, args) }, wait) } } var fn = function () { console.log('boom') } setInterval(debounce(fn,500),1000) // 第一次在1500ms后触发,之后每1000ms触发一次 setInterval(debounce(fn,2000),1000) // 不会触发一次(我把函数防抖看出技能读条,如果读条没完成就用技能,便会失败而且重新读条)
之所以回傳一個函數,因為防手震本身比較像是個函數修飾,所以就做了一次函數柯里化。裡面也用到了閉包,閉包的變數是 timer 。
函數節流
function throttle(fn, gapTime) { let _lastTime = null; return function () { let _nowTime = + new Date() if (_nowTime - _lastTime > gapTime || !_lastTime) { fn(); _lastTime = _nowTime } } } let fn = ()=>{ console.log('boom') } setInterval(throttle(fn,1000),10)
如圖是實現的一個簡單的函數節流,結果是一秒打出一次boom
上面是我整理給大家的,希望未來會對大家有幫助。
相關文章:
以上是在JS中有關函數節流和函數防手震(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版
好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。