JavaScript 中 this 是如何工作的?

控制 this 指向的具体方法有哪些?
关注者
122
被浏览
9,263

11 个回答

写个答案,看看自己是否掌握没 ^_Q
没写例子,大家自己测试一下吧,或者参考前面的答案,验证验证~

————————————————————————————————————————
ECMA 262 3rd:

需要注意的是,this的值在执行代码之前已经确认好了。也就是说,在进入variable context(执行环境)的时候创建的。

a. this指向哪里取决于reference type的值。

reference type的值取决于2样东西:
  • identifier(标志符)。如函数名,变量名等。

  • 访问属性的时候。

也就是说,在调用符号即`()`的左边,假如是identifier或者属性访问的时候,reference type的值就是他们所在的对象,即this指向他们所在的对象。如果不是的话,reference type的值就是null, 这时候this会指向global(全局对象)。


————————————————————————————————————————


b. 那么,为什么reference type的值会取决于上面提到的2样东西呢?


  • 首先是identifier。在标志符查询机制过程中,若在作用域中查询到想要的标志符,就会返回一个base对象,base的值就是标志符所在的变量对象。本质上,base的值就是reference的值。

  • 然后是属性访问。在new一个对象的算法中,一开始就将this值设置为新创建的对象。可以这样理解,当访问一个对象的属性或者方法的时候,this就是他们的对象。
(这里我之前纠结了很久,套用标志符查询机制的话,我又不懂对象的处理机制 = =)


————————————————————————————————————————

c. 特殊情况:

  • 当标志符的对象是AO(activation object)时,reference type的值是null,所以this指向global。例如函数嵌套的时候。这就可以解释为什么很多情况下this的值为global。
默认this是本对象的意思。

但是javascript里面的function有两个特殊方法call和apply,他们地一个变量,就是function内部的this,javascript里面的叫法是上下文。

这个在写函数可加强内联度。