JavaScript中this绑定规则未演变,仍由调用方式决定;差异源于新语法引入的上下文变化:箭头函数词法绑定、class方法隐式绑定、ESM顶层this恒为undefined、严格模式使默认绑定为undefined。

JavaScript 中 this 的绑定规则没有“演变”,它自语言诞生起就遵循一套明确、稳定的机制——只是不同执行上下文(尤其是函数调用方式)触发不同的绑定规则,而开发者常因混淆场景产生“规则变了”的错觉。ES6 箭头函数的引入不是改变原有规则,而是新增一种不绑定 this 的函数类型,从而让绑定逻辑更显清晰。
默认绑定:独立函数调用时的 this
在非严格模式下,直接调用普通函数(如 foo()),this 指向全局对象(浏览器中是 window);严格模式下则为 undefined。这是最基础也最容易出错的场景。
- 避免依赖默认绑定,尤其在模块化环境中全局对象不可靠
- 启用严格模式(
"use strict")可提前暴露this为undefined的问题 - Node.js 模块中顶层
this指向module.exports,并非全局对象,属于特殊间接绑定
隐式绑定:对象方法调用时的 this
当函数作为对象属性被调用(如 obj.method()),this 绑定到该对象(即点号左侧的对象)。但若提取方法后单独调用(const fn = obj.method; fn();),就会退回到默认绑定。
- 隐式绑定只看调用时的“点前对象”,与函数定义位置无关
- 嵌套对象(如
obj.inner.method())中,this指向inner,不是obj - 使用
.bind()、call()或箭头函数可固化或绕过隐式绑定
显式绑定:通过 call/apply/bind 强制指定 this
call 和 apply 立即执行并传入 this 值;bind 返回新函数,永久绑定 this(后续调用无法覆盖)。它们优先级高于隐式绑定。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
bind两次不会覆盖第一次绑定,返回的函数this固定不变 - 硬绑定函数无法被 new 调用(会忽略绑定的
this,改走构造函数规则) - ES6 的
Reflect.apply()是apply的标准化替代,语义一致
new 绑定与箭头函数:无 this 绑定的两种特例
用 new 调用函数时,引擎创建新对象并将其赋给 this;箭头函数则根本不设 this,而是沿外层作用域继承(词法绑定)。两者都不参与前述三类绑定竞争。
- 箭头函数的
this在定义时确定,与调用方式完全无关 - 不能用
new调用箭头函数,会抛出TypeError - 箭头函数适合回调场景(如
setTimeout、事件处理器),避免手动bind
理解这四类绑定的优先级(new > 显式 > 隐式 > 默认)和箭头函数的词法特性,就能准确预测任何调用下的 this 值。所谓“演变”,其实是开发者对规则认知逐步深入的过程,而非语言本身改变了行为。

















