1. 程式人生 > 其它 >js 防抖與節流函式之詳細解析

js 防抖與節流函式之詳細解析

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

指向了當前元件。