JS(八)閉包
// 閉包問題
//由於 JavaScript 中,函式是物件,
//物件是屬性的集合,而屬性的值又可以是物件,則在函式內定義函式成為理所當然,如果在
//函式 func 內部宣告函式 inner,然後在函式外部呼叫 inner,這個過程即產生了一個閉包。
var outter = [];
function clouseTest (){
var array = ["one","two","three","four"];
for(var i=0;i<array.length;i++){
var x = {};
x.no = i;
x.text = array[i];
x.invoke = function(){
alert(i);
};
outter.push(x);
}
}
//呼叫這個函式
clouseTest();
outter[0].invoke();//4 這樣的語句 x.invoke = function(){print(i);}並沒有被執行,
outter[1].invoke();//4
//閉包允許你引用存在於外部函式中的變數。然而,它並不是使
//用該變數建立時的值,相反,它使用外部函式中該變數最後的值。
// 這類問題改進如下:
function clouseTest2 (){
var array = ["one","two","three","four"];
for(var i=0;i<array.length;i++){
var x = {};
x.no = i;
x.text = array[i];
x.invoke = function(no){
alert(no);//在呼叫的當時就要用上,解決方法是立即執行該函式
}(i);
outter.push(x);
}
}
clouseTest2 ();