天天看點

js閉包的應用一、阻止垃圾回收機制二、建立私有變量三、避免污染全局變量四、防抖的應用

js閉包的應用

  • 一、阻止垃圾回收機制
  • 二、建立私有變量
  • 三、避免污染全局變量
  • 四、防抖的應用

一、阻止垃圾回收機制

在js中,閉包可以了解為能夠通路其他函數内部變量的函數,常見的閉包如下

function fn() {
  let a = 0;

  return function () {
    console.log(++a);
  }
}

let f = fn();
f(); // 1
f(); // 2
           

其中,被包含在fn函數中,并被傳回的函數就是一個閉包函數。由于作用域鍊的特性,内層函數可以通路外層函數的變量,是以閉包函數通路了fn中的變量a,并被全局變量f引用。js的垃圾回收器會在函數執行結束之後清除不再被引用的變量,而在fn執行之後,由于變量a在全局作用域中被引用,是以垃圾回收機制不會作用于變量a,即如果我們不手動清除,a會一直存在記憶體中。這就是閉包的特性之一,可以阻止垃圾回收機制。

二、建立私有變量

function privateValue() {
    var value;
 
    this.set = function(v) {
        value= v;
    };
 
    this.get = function() {
        return value;
    };
}
var x = new privateValue();
x.set("haha");
 
console.log(x.value); // undefined
console.log(x.get()); // haha
           

在js中,外層函數是無法讀取内層函數的變量的。利用閉包的特性,我們可以實作設定并擷取函數内部變量,以此達到建立私有變量的效果。

三、避免污染全局變量

在寫原生js或者jQuery代碼時,可能會遇到變量重複命名導緻沖突的情況,我們可以利用閉包來避免。

var a = 0;

(function() {
  var a = 1;
  
  console.log(a); // 1
})()

console.log(a); // 0
           

四、防抖的應用

function debounce(fn, delay = 500) {
  let timer = null;
  
  return function() {
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    
    timer = setTimeout(() => {
      fn();
    }, delay);
  }
}

function fn() {
  console.log('哈哈哈');
}

setInterval(debounce(fn), 1000)
           

防抖是使用者快速操作的情況下,對性能的優化的一種方案,它規定隻能在使用者停止操作的一段時間後才執行,也是利用了閉包的特性,将定時器存儲在記憶體中。

繼續閱讀