Tank0317

JavaScript中的this值(二)

13 Aug 2017

JS在运行过程中,什么时候会改变this值?

这是前几天面百度的时候,一个美女面试官问我的问题。或者可以这么说“哪些情况下会改变this值?”。当时我的回答是call、apply、bind,然后面试官问我”还有吗?“。这时我就不知道怎么回答了,还有别的改变this值的方式吗?

实际上现在想想,这个问题或许应该这么回答。

首先要明确一点,this值是永远有值而且是动态的,另外,this值是和执行环境绑定的。即this值是根据执行环境变化的量。

所以执行环境的变化会改变this值。(有关“执行环境”的解释可以参考这里)

那么我们的答案变成了,什么时候执行环境会变化,从而引起this值变化?一般情况是函数的调用会造成执行环境得变化,this值改变。而这里又分为几种情况(具体可以参考另一篇文章):

  • 函数作为对象的方法调用
  • 函数作为构造函数调用
  • 函数作为事件处理函数调用
  • 作为普通函数调用

以上几种函数调用方式都有相应this的取值逻辑。即当我们在js执行过程中遇到函数调用的时候,this值会根据函数的调用方式选择不同的取值逻辑,这个过程是由JS引擎来做的。(在函数调用时会改变执行环境,其中包括给this赋值。)

另外JS同时给了开发者机会去介入改变this值。比如:

  • Funtion.prototype.call
  • Funtion.prototype.apply
  • Funtion.prototype.bind

有了上面三个函数,我们就有机会人为的指定函数执行过程中this值的取值。实际上他们还是跟函数的调用有关,只不过这里调用是几个特殊的函数。

总之一句话,执行环境得变化会引起this值的改变。