JavaScript閉包的理解
阿新 • • 發佈:2018-12-10
閉包是指有權訪問另一個函式作用域中的變數的函式。
作用域
作用域分為全域性作用域和區域性作用域。
全域性作用域:最外層函式定義的變數擁有全域性作用域,任何內部函式都可以訪問。
區域性作用域:只在固定的程式碼片段內可以訪問,函式外部無法訪問。
全域性變數都是全域性物件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中可能導致記憶體洩露。解決方法:退出函式之前將不使用的區域性變數全部刪除。