閉包示例不宜多用,耗記憶體資源

2022-07-24 03:57:15 字數 1268 閱讀 8397

這樣函式會返回乙個陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置為0的函式返回0,位置為1的返回1,以此類推。但實際上,每個函式都返回10。因為每個函式的作用域鏈中都儲存著 cfunc()函式的活動物件,所以它們引用的都是同乙個變數i,當cfunc() 函式返回後,變數 i 的值為 10,此時每個函式都引用著儲存變數 i 的同乙個變數物件,所以在每個函式內部 i 的值都是 10

function cfunc();}

return result;

}var funcs = cfunc();

for(var i=0; i<10; i++)

//結果為

/*10

1010

1010

1010

1010

10*/

***********************************====

/*for(var i=0; i<10; i++)

結果為:

function ()

function ()

function ()

function ()

function ()

function ()

function ()

function ()

function ()

function ()

*/***************===

可以通過建立另乙個匿名函式強制讓閉包的行為符合預期:

function cfunc()

}(i);

}return result;

}var funcs = cfunc();

for(var i=0; i<10; i++)

// 結果為/*0

1234

5678

9*/沒有直接把閉包賦值給陣列,而是定義了乙個匿名函式,並將立即執行該匿名函式的結果賦給陣列。這裡的匿名函式有乙個引數 num, 也就是最終的函式要返回的值。在呼叫每個匿名函式時,我們傳入了變數 i,由於函式引數是按值傳遞的,所以就會將變數 i 的當前值複製給引數 num.而在這個匿名函式內部,又建立並返回乙個訪問 num 的閉包。這樣一來,result 陣列中的每個函式都有自己 num 變數的乙個副本,因此就可以返回各自不同的陣列了。

********************===

var nn = (function())();

以上會立即呼叫

var nn = (function());

nn();

在呼叫時才算真正呼叫

PHP閉包定義與使用簡單示例

c getclosure 123 i 456 c test sleep 3 c2 getclosure 123 c2 test c test output param test i 123 21 36 52 param test i 123 21 36 55 param test i 123 21 ...

閉包 解決閉包問題

1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...

python 閉包 python 閉包

閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...