1.闭包:其实就是一个函数,这个函数能够访问另一个作用域中的变量。创建闭包的常见方式,就是在一个函数内部创建(或引用)另一个函数,这另一个函数就是闭包。
function myFun(i)
{
var value1=function1(i);
var value2=function2(i);
if(value1<value2)
{
return -1;
}
else if(value1>value2)
{
return 1;
}
else
{
return 0;
}
}
{
var value1=function1(i);
var value2=function2(i);
if(value1<value2)
{
return -1;
}
else if(value1>value2)
{
return 1;
}
else
{
return 0;
}
}
函数function1(i)和function2(i)就是闭包。
2.闭包的副作用:闭包只能取得包含函数中任何变量的最后一个值。
function createFunctions()
{
var result=new Array();
for(var i=0;i<10;i++)
{
result[i]=function()
{
return i;
};
}
return result;
}
var funcs=createFunctions();
for(var i=0;i<funcs.length;i++)
{
document.write(funcs[i]()+"<br />");
}
{
var result=new Array();
for(var i=0;i<10;i++)
{
result[i]=function()
{
return i;
};
}
return result;
}
var funcs=createFunctions();
for(var i=0;i<funcs.length;i++)
{
document.write(funcs[i]()+"<br />");
}
所以输出的值全是10;
通过创建另一个匿名函数强制让闭包符合预期:
function createFunctions()
{
var result=new Array();
for(var i=0;i<10;i++)
{
result[i]=function(num)
{
return function()
{
return num;
};
}(i);
}
return result;
}
var funcs=createFunctions();
for(var i=0;i<funcs.length;i++)
{
document.write(funcs[i]()+"<br />");
}
{
var result=new Array();
for(var i=0;i<10;i++)
{
result[i]=function(num)
{
return function()
{
return num;
};
}(i);
}
return result;
}
var funcs=createFunctions();
for(var i=0;i<funcs.length;i++)
{
document.write(funcs[i]()+"<br />");
}
3.有关闭包中使用this对象:this 对象是在运行时基于函数的执行环境时绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
var name="Ths Window";
var object={
name:"My Object",
getNameFunc:function()
{
return function()
{
return this.name;
}
}
}
alert(object.getNameFunc()());
var object={
name:"My Object",
getNameFunc:function()
{
return function()
{
return this.name;
}
}
}
alert(object.getNameFunc()());
当跳出了object.getNameFunc()时,this.name就变成了window.name.所以输出的是“Ths Window", 如果想让对象内部的变量name
可以在this是object的时候把this.name保存在某个在某个变量中,如下:
var name="Ths Window";
var object={
name:"My Object",
getNameFunc:function()
{
var object={
name:"My Object",
getNameFunc:function()
{
var local=this;
return function()
{
return function()
{
return local.name;
}
}
}
alert(object.getNameFunc()());