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

猜你喜欢

转载自blog.csdn.net/bujiongdan/article/details/83150638