this的绑定规则取决于函数调用的上下文。主要有以下四种情况:全局作用域、对象方法、构造函数和箭头函数。全局作用域下,this指向全局对象;对象方法中,this指向调用它的对象;构造函数中的this指向新创建的对象实例;箭头函数则继承外部的this值。理解这些规则有助于正确使用this。在JavaScript中,this关键字是动态的,它根据函数调用的位置和方式来改变其绑定的对象,掌握this的绑定规则对于理解代码执行上下文和编写可维护的JavaScript代码至关重要,本文将详细探讨this的四种绑定规则:默认绑定、隐式绑定、显式绑定以及new绑定。

1、默认绑定
全局作用域下的函数调用:当一个函数在全局作用域下被调用时,this通常指向全局对象(在浏览器中是window),除非使用strict mode(严格模式),在严格模式下,this会被绑定到undefined。
函数是否处于严格模式:严格模式移除了this指向全局对象的默认行为,使得this在函数内部默认为undefined,除非显式地绑定到某个对象。
2、隐式绑定
对象方法中的函数调用:当函数作为对象的方法被调用时,this通常指向调用它的对象,这是由于函数调用的上下文与对象关联,从而使this隐式地绑定到该对象上。

嵌套对象调用的情况:如果函数调用位置是在一串对象属性链中,this绑定的是最内层的对象。obj.someObj.someFunc()中的someFunc会将this绑定到someObj上。
3、显示绑定
使用call或apply方法:通过函数的call或apply方法,我们可以显式地将this绑定到任何指定的对象上,这两个方法允许我们定义函数内部this的值。
使用bind方法:bind方法创建一个新的函数,这个新函数的this值被绑定到传递给bind的第一个参数上,无论这个函数是如何被调用的。
4、new 绑定

构造函数调用:当函数通过new关键字调用时,this会被绑定到新创建的对象上,这个过程涉及到创建一个新对象,并把构造函数中的this绑定到这个新对象上。
Class类的实例化:在使用ES6的类语法时,同样应用了new绑定规则,类的构造器中的this也是指向新创建的实例对象。
相关问题与解答
1、问:为什么在严格模式下,全局作用域中的函数this会绑定到undefined?
答:这是为了减少错误发生的可能,避免在不使用对象方法的情况下不小心引用了全局对象,从而引发不易察觉的错误。
2、问:如何在不改变函数内部代码的情况下,改变this的绑定对象?
答:可以使用call、apply或bind方法来显式地指定this的绑定对象,这样我们就可以控制函数内部this的指向,而不改变函数本身的代码。