一 关于this的赋值问题
this对象是在运行时给予函数的运行环境绑定的。
全局函数:this==window
函数作为某个个对象的方法调用时this指向这个对象
匿名函数的执行环境具有全局性所以this位于匿名函数内时指向window但是编写闭包得的方式不同结果也不同
举个栗子:
var name = "The Window";
var object = {
name:"My object",
getNameFunc:function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());//The Window
为什么是the window 而不是the object :每个函数在被调用的时候,其活动对象都会自动获取两个特殊的变量即this和arguments,内部函数在搜索这两个变量的时候都会搜索到函数内部,而不会延伸到直接访问外部函数中的这两个变量
意思是什么呢,就是说比如上面的栗子,getNameFunc:function()这个函数在执行的时候他的活动对象是object,这个object就会自动取得两个特殊变量就是this和arguments,this指向的就是这个object,arguments指向的是这个函数参数的集合!
在这里如果我们想让内部函数访问外部函数的this还需要做点工作,因为我们知道内部函数执行时会有一个作用域链,我们只要把外部函数的this赋值到一个内部函数能访问的域链的一个变量里面就可以了,举个栗子:
var name = "The Window";
var object = {
name:"My object",
getNameFunc:function(){
var that = this;//这里将对象this-object赋予变量that而内部函数能访问这个变量
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());//the object
下面在这个情况也比较典型在这里我们举例说明一下:
var name="the window";
var object={
name:"my object",
getName:function(){
return this.name;
}
};
(object.getName=object.getName)();//非严格模式下 the window
为啥呢:::因为返回的函数是function(){return this.name}不通过object。getName执行了所以this的指向已经发生了改变