如何理解JavaScript闭包问题

来源:互联网 发布:ubuntu极点五笔安装 编辑:程序博客网 时间:2024/04/29 02:01

    闭包是指有权访问另一个函数作用于中的变量的函数,注意删繁就简后,闭包是函数。创建一个闭包的方式是在一个函数中创建另一个函数。

function ccc(propertyname){
return function(obj1,obj2){
var value1=obj1[propertyname];  //匿名函数1
var value2=obj2[propertyname];  //匿名函数2
if(value1<value2){
return -1;
}
else if(value1>value2){
return 1;

else {
return 0;
}

};
}
var compare=ccc("name");
var result=compare({name:"clh"},{name:"jy"});
alert(result); // -1
    匿名函数12访问了外部函数中的变量name,即使这个内部函数返回了而且是在其他地方调用了,但他仍然可以访问变量name.这就是闭包函数。这是因为内部函数的作用域链中包含着ccc()的作用域.。

作用域链机制引出一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。看代码。

function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i] = function(){
return i;
};

}
return result;
}
var p = createFunctions()[1]();
alert(p);

无论你执行的是result[几],结果都返回的10。这是因为createFunctions()函数中的i再循环完毕以后已经变为10 ,而result数组中存放的是一十个function函数,函数完毕再执行一次createFunctions()[1](),才能返回i的值。此时,执行函数createFunctions()[1]()相当于执行

function(){

return i;

}

虽然i在createFunctions()[1]()的作用域链中,但是值唯一是10。只有在createFunctions() 将result[i] = function(){return i;}(i)执行了,才能将i分别保存在result数组中。

function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i] = function(){
return i;
}(i);    //趁着i没有循环完,将实时的i值返回。
//result[i]=i;



}
return result;
}
var p= createFunctions();


alert(p);

结果 0,1,2,3,4,5,6,7,8,9.


原创粉丝点击