闭包是指有权访问另一个函数作用于中的变量的函数,注意删繁就简后,闭包是函数。创建一个闭包的方式是在一个函数中创建另一个函数。
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.