1. 程式人生 > >JavaScript閉包的理解

JavaScript閉包的理解

閉包是指有權訪問另一個函式作用域中的變數的函式。

作用域

作用域分為全域性作用域區域性作用域

全域性作用域:最外層函式定義的變數擁有全域性作用域,任何內部函式都可以訪問。
區域性作用域:只在固定的程式碼片段內可以訪問,函式外部無法訪問。

全域性變數都是全域性物件window的一個屬性。

作用域鏈

作用域鏈就是根據內部函式可以訪問外部函式變數的這種機制,鏈式向上查詢決定哪些資料可以被內部函式訪問。
當某一個函式被呼叫時就會建立一個執行環境和相關作用域鏈

作用域鏈的用途,是保證有權訪問當前執行環境的所有變數和函式的有序訪問。

閉包

某些時候我們需要得到一個函式內部的區域性變數,這時就需要用到閉包。
閉包

是指有權訪問另一個函式作用域中的變數的函式。
閉包的建立方式是在一個函式內部建立另一個函式。

function f1(){
   var n=999;
   function f2(){
       console.log(n);   //n=999;
   }
}

上面的函式中,f2被包含在f1內部,f2可以得到f1中的所有區域性變數,但f1無法得到f2中的區域性變數。
那麼只要把f2作為返回值,就可以被f1獲取。

function f1(){
   var n=999;
   function f2(){
       console.log(n);   //n=999;
   }
   return f2;
}
var result=f1(); //返回的是f2函式
result(); //999

這個f2函式就是閉包。

閉包的作用

閉包可以用來讀取內部函式的變數,還可以讓這些變數的值始終儲存在記憶體中,不會在f1呼叫後被自動清除。

原因是f1是f2的父函式,f2被賦予了一個全域性變數,所以f2始終在記憶體中。而f2的存在依賴於f1,所以f1也始終存在於記憶體中,不會在呼叫結束後被垃圾回收機制回收。

注意

注意在函式內部宣告變數時要用var,否則宣告的是一個全域性變數。

閉包會使函式中的變數都被儲存在記憶體中,消耗較大,所以不能濫用會造成網頁效能問題。IE中可能導致記憶體洩露。解決方法:退出函式之前將不使用的區域性變數全部刪除。