JavaScript闭包与变量、this对象

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对象,必须将对象的引用保存到另一个闭包能够访问的变量中。

猜你喜欢

转载自blog.csdn.net/yangyuqingabc/article/details/83216923