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值的改变。