1. 程式人生 > 實用技巧 >Javascript基礎——閉包為什麼會存在

Javascript基礎——閉包為什麼會存在

閉包(closure)為什麼會存在

在ES6以前,Javascript只有全域性作用域和函式作用域的概念,與之相對應的全域性變數和區域性變數。如果有一個變數在函式作用域被聲明瞭,那麼函式外如何訪問這個變數。那就是在函式f1的內部在定義一個函式f2,此時函式f1的區域性變數就對函式f2是可見的。只要把函式f2作為返回值那麼我們就可以在函式f1外部讀取它的內部變數。

      //閉包
       function f1 (){
          var a = 10;
          return function f2(){
            console.log(a);
          };
       }
       f1()();//10

什麼是閉包?

當函式可以記住並訪問所在的詞法作用域,即使函式在當前詞法作用域外執行,這就產生了閉包。
換句話說閉包就是函式中的函式,裡面的函式可以訪問外部函式的變數,外面的變數是這個內部函式的一部分。那麼我們可以總結出閉包形成的條件:1.函式巢狀 2. 內部函式引用外部函式的區域性變數

閉包的應用

可以讀取函式內部的變數
可以使變數的值長期儲存在記憶體中
可以用來實現JS模組

閉包的危害

一般情況下,函式執行會形成一個新的私有的作用域,當私有作用域中的程式碼執行完成後,我們當前作用域都會主動進行釋放和消毀,但遇到函式執行返回了一個引用資料型別的值,並且在函式的外面被一個其他的東西給接收了。這種情況下一般形成的私有作用域都不會銷燬。這時候就發生了記憶體洩漏,什麼叫記憶體洩漏,任何物件在您不在擁有或需要它之後仍然存在。

function outer(){
  var num = 0 ;
  return function inner(){
      num++;
      console.log(num);
  }
}
var f1 = outer();
f1(); // 1 inner函式的作用域一直被佔用 
f1(); // 2 inner函式的作用域一直被佔用
f1(); // 3 inner函式作用域一直被佔用