this对象是在运行时基于函数的执行环境绑定的:
1)在全局函数中,this等于window
2)当函数被作为某个对象的方法调用时,this等于那个对象
3)匿名函数的执行环境具有全局性,因此其this对象通常指向window(通过call和apply可以改变this的指向)
下面来看一些例子:
var name="Window"; var obj={ name:"Object", getName:function(){ return function(){ return this.name; }; } }上面的代码中,我们首先创建了一个全局变量name,其值为“Window”,又创建了一个包含name属性的对象,且该对象中还有一个方法getName(),这个方法返回一个匿名函数,而匿名函数又返回this.name。
现在,我们来调用getName方法内部的匿名函数:
JavaScript高程一书中对于这个的解释是这样的:每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量的时候,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。
如果想获得obj对象中的name值,可以这样:
var name="Window"; var obj={ name:"Object", getName:function(){ var that=this; return function(){ return that.name; } } }在定义匿名函数之前,我们把this对象赋值给一个名为that的变量,这里的that则引用着obj,调用obj方法内部的匿名函数:
在一些特殊情况下,this的值可能会发生改变:
var name="Window"; var obj={ name:"Object", getName:function(){ return this.name; } }以下集中调用方式返回的结果有区别:
第一行是正常调用了对象obj的方法getName()
第二行在调用这个方法之前给它加上了一个括号,表示引用一个函数
第三行先执行了一个赋值语句,然后再调用赋值后的结果