JavaScript中this的绑定在函数调用时动态确定,取决于调用方式,优先级为:new绑定>显式绑定>隐式绑定>默认绑定。

JavaScript 中 this 的绑定不是在函数定义时决定的,而是在函数被调用时、由调用方式动态确定的。它不依赖于函数在哪里声明,只取决于“谁在调用它”以及“怎么调用”。这种运行期绑定机制是理解 this 行为的关键。
默认绑定:独立调用时的 this 指向
当函数以简单形式被直接调用(如 foo()),且不在对象上下文或严格模式中,this 会绑定到全局对象(浏览器中是 window,Node.js 中是 global)。在严格模式下,此时 this 为 undefined。
- 非严格模式:
function foo() { console.log(this); } foo(); // window - 严格模式:
"use strict"; function foo() { console.log(this); } foo(); // undefined
隐式绑定:方法调用时的 this 指向
当函数作为对象的属性被调用(即通过点号或方括号访问后立即调用),this 绑定到该对象。这是最常见的绑定场景,但要注意“丢失绑定”的问题——一旦把方法赋值给变量或传入回调,隐式绑定就失效了。
const obj = { name: 'a', say() { console.log(this.name); } }; obj.say(); // 'a'const fn = obj.say; fn(); // this 不再是 obj(默认绑定生效)
显式绑定:call、apply、bind 主动指定 this
这三个方法允许在运行时手动设定函数执行时的 this 值。其中 call 和 apply 立即执行,区别在于参数传递方式;bind 返回一个新函数,其 this 被永久绑定,后续调用无法覆盖(除非使用 new)。
立即学习“Java免费学习笔记(深入)”;
-
foo.call(obj, 1, 2);——this指向obj -
foo.apply(obj, [1, 2]);—— 同上,参数以数组形式传入 const bound = foo.bind(obj); bound(); // this 始终是 obj
new 绑定:构造函数调用时的 this 指向
使用 new 调用函数时,JavaScript 引擎会创建一个新对象,并将该对象赋给 this,同时让新对象继承构造函数的原型。此时 this 指向这个新实例,且优先级高于显式绑定(bind 返回的函数用 new 调用时,绑定的 this 会被忽略)。
function Person(name) { this.name = name; } const p = new Person('Alice'); // this 指向新对象 pconst boundPerson = Person.bind({}); new boundPerson('Bob'); // this 仍是新实例,不是 { }
这四类绑定按优先级从高到低依次是:new 绑定 > 显式绑定 > 隐式绑定 > 默认绑定。实际运行中,引擎会按此顺序判断最终的 this 值。理解这一流程,就能准确预测任意调用形式下的 this 行为。


















