js 防抖與節流函式之詳細解析
阿新 • • 發佈:2021-06-28
1、防抖 debounce
簡而言之就是延遲函式的執行。
網上一搜,基本上都是給你寫下面那麼一個函式,但是為何要這麼寫,卻沒人告訴你;而我自己也是看得雲裡霧裡。
// 非立即執行版 function debounce(func, wait) { let timer = null; return () => { // 閉包 let args = arguments; // arguments 中存著匿名函式的引數 if (timer) clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); // 改變this指向, 傳入引數 }, wait); }; }
現在逐一解析為什麼要這樣寫。
外層函式定義一個變數來裝定時器,而它的返回值是一個匿名函式,所以就成為了閉包;
由於閉包用了外層函式的變數,所以js垃圾回收機制是不會回收 timer 這個變數的,timer 會一直存在於記憶體之中;
arguments 為匿名函式引數列表,它是個偽陣列;即使匿名函式沒有定義形參,等使用者呼叫函式的時候加了實參, arguments 也會接收實參,以陣列的形式。
apply 改變 this 指向,會立即執行,第二個引數為傳入的引數,是個陣列;那麼第一個引數 this 是什麼意思,這裡的this指向了誰?
顯然,在瀏覽器環境下執行的話,這裡的this就是指的window物件,因為沒有另外的物件呼叫它;
如果在vue元件裡,這裡的this指向誰?
VueComponent
指向了當前元件。