JavaScript中this指向由调用方式决定,优先级为:new绑定>显式绑定>隐式绑定>默认绑定;new调用时this指向新实例,显式绑定通过call/apply/bind指定,隐式绑定限于obj.fn()形式,否则默认绑定在非严格模式下指向全局对象、严格模式下为undefined。

判断 JavaScript 中的 this 指向,关键不是“函数在哪定义”,而是“函数怎么被调用”。所有规则按明确优先级生效,从高到低依次为:new 绑定 > 显式绑定(call/apply/bind)> 隐式绑定(对象方法调用)> 默认绑定(独立调用)。只要高优先级规则适用,低优先级就完全不参与判断。
new 绑定:构造函数调用时 this 指向新创建的对象
当函数通过 new 关键字调用时,无论函数内部是否用了 call、bind 或是否属于某个对象,this 都强制指向新生成的实例对象。
- 例如:
function Person(name) { this.name = name; },执行new Person('Alice')时,this 就是那个新 Person 实例。 - 即使该函数已被 bind 过,
new也会忽略显式绑定,重新创建 this。
显式绑定:call、apply、bind 直接指定 this 对象
当函数通过 call()、apply() 或 bind() 调用时,this 被明确设为传入的第一个参数(除非是 new 调用已覆盖)。
-
obj1.method.call(obj2)→ this 是 obj2 -
const bound = fn.bind(obj3); bound();→ this 是 obj3(除非再被 new) - 注意:bind 返回的新函数,若后续又被 new 调用,则 new 绑定优先,this 不再是 bind 指定的对象。
隐式绑定:对象点号调用,this 指向调用者对象
当函数作为对象的属性被调用(如 obj.fn()),this 自动绑定到该对象——但仅限于“直接调用”且“调用位置有上下文对象”。
- 有效示例:
const user = { name: 'Bob', say() { console.log(this.name); } }; user.say();→ this 是 user - 常见陷阱(隐式丢失):
const say = user.say; say();→ 此时已脱离对象上下文,退回到默认绑定 - 嵌套引用只看最后一层:
obj1.obj2.method()→ this 是 obj2,不是 obj1
默认绑定:无任何修饰的独立调用
当函数既没被 new、也没被 call/apply/bind、也没作为对象方法调用时,就走默认绑定。
- 非严格模式下:this 指向全局对象(浏览器中是 window)
- 严格模式下:this 是 undefined(ES5 起,模块脚本默认严格模式)
- 注意:是否严格,取决于函数**自身定义处**是否启用 strict,而非调用位置
实际判断时,只需按顺序检查调用形式:先看有没有 new;没有就看有没有 call/apply/bind;还没有就看是不是 obj.fn() 这种写法;最后才考虑默认绑定。每一步确认后,后续规则全部跳过。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











