首先, 防抖是面試中的常見問題,而項目中也會有很多地方可以用到。抱着學習的心態寫了一個防抖函數, 有不足之處,請大佬指教!
定義:多次觸發事件時, 只執行一次回調,在事件被觸發n秒後執行回調 , 如果在n秒內再次觸發則重新計算
總而言之: 防抖的結果是, 事件只會執行一次
代碼如下:
<body>
<input type="text" id="input">
</body>
<script>
function debounce(fn, delay) {
console.log(arguments);
let timer = null
return function() {
clearTimeout(timer) // 每次清除定時器,防止定時器累加
timer = window.setTimeout(()=>{
fn.apply(this, arguments)
}, delay)
}
}
let fn = debounce(function(e) {
console.log('防抖成功', e.target.value);
}, 1000)
document.getElementById('input').addEventListener('input', fn)
</script>
其中, arguments有點不是很明白, 順便寫了自己的理解, 希望大佬們指正
在函數調用的時候,瀏覽器每次都會傳遞進兩個隱式參數
- 函數的上下文對象this
- 封裝實參的對象arguments
function fun(){
console.log(arguments);
}
fun('tom',[1,2,3],{name:'Janny'});
看到下面打印出來的結果,arguments是有值的,它的值就是我們傳遞進去的參數,雖然我們沒有給fun函數定義形參,但是我們還是可以通過arguments來調用傳遞給函數fun的實參。
簡單的理解:每個函數都有一個arguments屬性,表示函數的實參集合,這裏的實參是重點,就是執行函數時實際傳入的參數的集合。
此處arguments理解不是很透徹, 希望大佬指正
參考文檔:https://www.jianshu.com/p/d7ed5ade67a3