關鍵知識點:
當內部函式被儲存到外部的時候會形成閉包,而內部函式的scope(作用域)會被保留,內部函式的ao(activation object)儲存著當前的執行上下文中的引數,被外部函式呼叫的時候使用的仍舊是ao中的引數。
**如下
function a()
return b;
}var test = a();
test();
test();
輸出結果為101 102
當執行第乙個test()時:
直接進入b函式執行
b函式尋找引數num,b函式的ao中沒有引數num,呼叫外部函式a函式的num==100
執行num++,輸出101
執行結束,b函式被儲存到外部,執行上下文不銷毀
當執行第二個test()時:
進入b函式執行
b函式尋找num引數,找到b函式ao中保留的引數num==101
執行num++,輸出102
執行結束
寫在最後
閉包的隱患就在於我們在變成中無意中把內部函式儲存到了外部,作用域鏈機制依然有些,儲存的東西無法釋放,佔著茅坑不拉屎,即記憶體洩漏(記憶體洩漏一詞指的是記憶體占用了,剩下的記憶體就少了,即是「剩下的記憶體洩漏」)
閉包產生私有化變數,防止命名空間的汙染
下面三個函式分別和deng形成了閉包,共同用deng的閉包 preparewife這個變數能用,但是無法訪問,因為它不是物件生成的東西,是物件和原有空間生成的閉包,這就是私有化變數 function deng name,wife this changepreparewife function tar...
閉包的鏈式呼叫問題
function fun n,o var a fun 0 a.fun 1 a.fun 2 a.fun 3 undefined,var b fun 0 fun 1 fun 2 fun 3 undefined,var c fun 0 fun 1 c.fun 2 c.fun 3 undefined,問 三...
PHP閉包呼叫外部引數使用範例
話不多說,直接上 大家測試執行一下即可,主要涉及use關鍵字和 引用識別符號,大家應用一下即可 a 1 a closure1 function p1,p2 use a closure2 function p1,p2 use a closure1 11111 22222 closure2 3333 4...