JavaScript闭包与变量、this对象
闭包与变量
闭包只能取得包含函数任何变量的最后一个值。
function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(){
return i;
};
}
return result;
}
console.log(createFunctions()[6]());//10
//让闭包的行为符合预期
function createFunctions2(){
var result2=new Array();
for(var i=0;i<10;i++){
result2[i]=function(num){
return function(){
return num;
};
}(i);
}
return result2;
}
console.log(createFunctions2()[6]());//6
注:由于函数参数是按值传递的,所以就会将变量i的当前值复制给参数num.
闭包与this对象
当函数被当做函数调用时,this对象是在基于函数的执行环境绑定的,而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window.
var name="The window";
var object={
name:"My Object",
getNameFunc:function(){
return function(){
return this.name;
};
}
};
console.log(object.getNameFunc()());//The window
//让闭包的行为符合预期
var name="The window";
var object={
name:"My Object",
getNameFunc:function(){
var that=this;
return function(){
console.log(that.name);
}
}
};
object.getNameFunc()();//My Object
注:1.在定义匿名函数之前,我们把this对象赋值给了一个名叫that的变量。而在定义了闭包之后,闭包也可以访问这个
变量,因为它是在包含函数中特意声明的一个变量。2.每个函数在被调用时都会取得两个特殊变量:this和arguments.内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。arguments也存在同样的问题,如果想访问作用域中的arguments对象,必须将对象的引用保存到另一个闭包能够访问的变量中。