什麼是閉包?有哪些使用場景?優缺點是什麼?

上官婉兒也得寫程式碼發表於2019-01-08

一:什麼是閉包?

閉包就是能夠讀取其他函式內部變數的函式,說白了閉包就是個函式,只不過是處於其他函式內部而已。

由於在javascript中,只有函式內部的子函式才能讀取區域性變數,所以說,閉包可以簡單理解成“定義在一個函式內部的函式“。

所以,在本質上,閉包是將函式內部和函式外部連線起來的橋樑。

知乎大神說:閉包是指在 JavaScript 中,內部函式總是可以訪問其所在的外部函式中宣告的引數和變數,即使在其外部函式被返回(壽命終結)了之後。

二:用途是什麼?

1.訪問函式內部的變數

2.防止函式內部的變數執行完城後,被銷燬,使其一直儲存在記憶體中。

寫一個關於閉包的例子:

function outer(x) {

// 引數相當於區域性的變數

    function inner(y) {

       console.log(x + y);

}

   return inner;

}

var closure = outer(3);

closure(7); // 輸出10

 

inner函式把自己內部的語句,和自己在宣告時所處的作用域一起封裝成了一個密閉的環境,我們就稱之為閉包。

函式本身就是一個閉包,函式在定義的時候,就能記住自己的外部環境和內部語句,每次執行的時候,會參考定義時的密閉環境。

關於閉包的用處的例子:看的MDN網站上的例子,講的非常清楚了

var makeCounter = function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }  
};

var Counter1 = makeCounter();
var Counter2 = makeCounter();
console.log(Counter1.value()); /* logs 0 */
Counter1.increment();
Counter1.increment();
console.log(Counter1.value()); /* logs 2 */
Counter1.decrement();
console.log(Counter1.value()); /* logs 1 */
console.log(Counter2.value()); /* logs 0 */

每次呼叫其中一個計數器時,通過改變這個變數的值,會改變這個閉包的詞法環境。然而在一個閉包內對變數的修改,不會影響到另外一個閉包中的變數。以這種方式使用閉包,提供了許多與物件導向程式設計相關的好處 —— 特別是資料隱藏和封裝

缺點:

如果不是某些特定任務需要使用閉包,在其它函式中建立函式是不明智的,因為閉包在處理速度和記憶體消耗方面對指令碼效能具有負面影響。

實際專案應用:

封裝一個公共彈框,點選確定取消按鈕,會觸發退訂事件,呼叫退訂介面,成功之後還會重新整理列表。

彈框元件接受一個 確定按鈕的事件,OK引數。

如果 OK 不寫成箭頭函式,那麼裡面的this 指向的是OK 而不是vue ,就無法執行,methods 的方法,也可以 在外部

let _this = this;

ok: function() {

_this.exitOrder();

}

這麼寫也可以。

 

相關文章