這樣函式會返回乙個陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置為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 ...