1. 程式人生 > >JS(八)閉包

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 ();