JavaScript中this的指向取决于函数调用方式而非定义方式,运行时动态确定;掌握构造函数调用、显式绑定、隐式绑定、默认绑定和箭头函数五种场景即可准确判断。

JavaScript 中 this 的指向不看函数怎么写,只看函数**怎么被调用**。它在运行时动态确定,不是定义时绑定的。掌握五种核心调用场景,就能准确判断。
1. 构造函数调用(new):this 指向新创建的实例
当函数用 new 关键字调用时,this 一定指向刚生成的那个空对象(后续成为实例)。
- 即使构造函数内部没写
return,也会默认返回这个新对象 - 如果显式返回一个对象,则 this 的结果被覆盖;返回原始值(如字符串、数字)则无效,仍返回新实例
- 常见陷阱:漏写
new,比如直接调用Person("Alice"),此时退化为普通函数调用,this 指向全局或 undefined,可能污染全局环境
2. 显式绑定(call / apply / bind):this 由你手动指定
这三个方法允许你传入任意对象作为 this 值,优先级高于隐式绑定和默认绑定。
-
fn.call(obj, a, b)和fn.apply(obj, [a, b])立即执行,临时把 this 设为obj -
const bound = fn.bind(obj)返回一个新函数,this 被永久锁定为obj,后续再用call或apply也无法覆盖 - 适合用于事件回调、定时器中固定上下文,比如
btn.addEventListener('click', handler.bind(this))
3. 隐式绑定(对象方法调用):this 指向点号左边的对象
函数作为对象属性被调用时(obj.method()),this 指向该对象;嵌套调用也只看“最后一层点”。
立即学习“Java免费学习笔记(深入)”;
-
obj.inner.fn()中,this 指向inner,不是obj - 一旦把方法赋值给变量:
const f = obj.method; f();,就失去隐式绑定,退回到默认绑定规则 - 常见于事件监听器或 setTimeout 中丢失 this:
setTimeout(obj.method, 100)→ 此时是普通调用,不是对象调用
4. 默认绑定(普通函数调用):严格模式决定 this 是什么
函数不通过对象、new 或显式绑定方式调用时(如 foo()),进入默认绑定。
- 非严格模式下:this 指向全局对象(浏览器是
window,Node.js 是global) - 严格模式下(含 ESM 模块):this 是
undefined,避免意外修改全局 - 建议所有脚本顶部加
'use strict',让行为更可预测 - 若真需要访问全局,显式写
window.xxx或globalThis.xxx,更安全清晰
5. 箭头函数:没有自己的 this,继承外层普通函数的 this
箭头函数不参与上述四条规则,它根本没有 this 绑定机制,而是沿词法作用域向上查找最近的非箭头函数的 this 值。
- 适合解决回调中 this 丢失问题,例如:
setTimeout(() => console.log(this.name), 100) - 不能用
call/apply/bind改变它的 this,因为根本不存在 - 不能作为构造函数(没有 prototype,调用 new 会报错)
- 注意:外层如果是默认绑定(如顶层箭头函数),那它的 this 就是全局或 undefined,不是“自动捕获对象”


















