JavaScript中this指向如何确定_常见绑定规则

JavaScript中this指向由调用方式决定:1.new绑定指向新对象;2.显式绑定(call/apply/bind)优先级最高;3.隐式绑定指向调用它的对象;4.默认绑定非严格模式为window、严格模式为undefined;箭头函数无this,继承外层词法作用域。

JavaScript中this的指向不是看函数怎么定义,而是看它**怎么被调用**。核心原则就一条:谁调用,this就指向谁(箭头函数除外)。下面按优先级从高到低说清楚最常见的4种绑定规则。

1. new 绑定:构造函数调用时 this 指向新创建的对象

当函数通过 new 调用时,无论函数内部怎么写,this 都指向由 new 创建的那个新对象。

  • 引擎会自动创建一个空对象,并把它赋给 this
  • 函数体内的属性和方法会挂载到这个 this
  • 如果函数显式返回一个对象,就返回那个对象;否则默认返回 this

例如:

function Person(name) {
  this.name = name;
}
const p = new Person('Alice'); // this 指向 p

2. 显式绑定:call / apply / bind 强制指定 this

这三个方法可以手动把 this 绑定到任意对象上,优先级高于隐式绑定和默认绑定。

  • func.call(obj, a, b):立即执行,thisobj
  • func.apply(obj, [a, b]):同上,参数以数组传入
  • const fn = func.bind(obj):返回一个新函数,this 永远是 obj

注意:bind 多次调用只生效第一次,后续的 bind 不会覆盖原始绑定。

3. 隐式绑定:对象方法调用时 this 指向调用它的对象

这是最常见也最容易出错的情况:函数作为对象的属性被调用(即“点”出来的)。

  • obj.foo()thisobj
  • 但一旦把方法提取出来单独调用,比如 const fn = obj.foo; fn();,就丢失了隐式绑定,退回到默认绑定(非严格模式下是 window,严格模式下是 undefined
  • 嵌套对象只看最后一层调用者:obj.inner.method()thisinner,不是 obj

4. 默认绑定:独立函数调用时的兜底规则

既没 new、也没显式绑定、也没隐式调用,就走默认绑定。

  • 非严格模式下:this 指向全局对象(浏览器里是 window
  • 严格模式下:thisundefined
  • ES6 模块中的顶层 this 始终是 undefined(模块自动启用严格模式)

箭头函数不遵循以上任何规则——它没有自己的 this,而是沿用外层普通函数作用域的 this 值(词法绑定),所以不能用 call/apply/bind 改变它的 this

基本上就这些。记牢调用方式决定 this,而不是定义方式,再结合优先级顺序判断,就不会乱了。