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 绑定到任意对象上,优先级高于隐式绑定和默认绑定。
立即学习“Java免费学习笔记(深入)”;
-
func.call(obj, a, b):立即执行,this是obj -
func.apply(obj, [a, b]):同上,参数以数组传入 -
const fn = func.bind(obj):返回一个新函数,this永远是obj
注意:bind 多次调用只生效第一次,后续的 bind 不会覆盖原始绑定。
3. 隐式绑定:对象方法调用时 this 指向调用它的对象
这是最常见也最容易出错的情况:函数作为对象的属性被调用(即“点”出来的)。
-
obj.foo()→this是obj - 但一旦把方法提取出来单独调用,比如
const fn = obj.foo; fn();,就丢失了隐式绑定,退回到默认绑定(非严格模式下是window,严格模式下是undefined) - 嵌套对象只看最后一层调用者:
obj.inner.method()中this是inner,不是obj
4. 默认绑定:独立函数调用时的兜底规则
既没 new、也没显式绑定、也没隐式调用,就走默认绑定。
- 非严格模式下:
this指向全局对象(浏览器里是window) - 严格模式下:
this是undefined - ES6 模块中的顶层
this始终是undefined(模块自动启用严格模式)
箭头函数不遵循以上任何规则——它没有自己的 this,而是沿用外层普通函数作用域的 this 值(词法绑定),所以不能用 call/apply/bind 改变它的 this。
基本上就这些。记牢调用方式决定 this,而不是定义方式,再结合优先级顺序判断,就不会乱了。










