普通函数的this是动态绑定的,取决于调用方式;箭头函数的this是词法绑定的,继承定义时外层作用域的this。二者分属不同机制:动态性关乎运行时调用,词法绑定则是静态确定。

JavaScript 中 this 的“动态性”和“词法绑定”不是同一维度的概念,它们描述的是 this 在不同函数类型中的行为差异:普通函数的 this 是运行时决定的(动态),而箭头函数的 this 是写死在定义位置的(词法)。
普通函数的 this 是动态绑定的
它的值完全取决于函数**怎么被调用**,而不是函数写在哪、长什么样:
- 作为对象方法调用,如
obj.fn(),this指向obj - 单独调用,如
fn(),非严格模式下指向全局对象(window或global),严格模式下是undefined - 用
call、apply、bind显式传参,this就是你指定的那个对象 - 用
new调用,this指向新创建的实例
箭头函数的 this 是词法绑定的
它根本没有自己的 this,而是直接沿用**定义时所在外层作用域**的 this 值:
- 不响应任何调用方式 ——
obj.arrowFn()、arrowFn.call(obj)、setTimeout(arrowFn)都无法改变它的this - 向外查找时,只认第一个非箭头函数的
this;如果顶层是模块作用域,就继承模块的this(通常是undefined) - 在对象字面量里直接写箭头函数,
this不会指向该对象,而是指向外层上下文
词法作用域 ≠ this 的词法绑定
这是常被混淆的一点:JavaScript 的变量作用域(let/const/var)确实是词法作用域,但 this 本身不属于作用域系统。词法作用域管“找变量”,this 管“找执行上下文对象”。箭头函数只是借用了词法作用域的查找逻辑来确定 this,但它本质上仍是 this 绑定机制的一种特殊实现,不是作用域规则本身。
立即学习“Java免费学习笔记(深入)”;
什么时候该用哪种?
选函数类型,核心看是否需要控制 this 的归属:
- 需要动态
this:比如对象方法、构造函数、事件处理器中要访问当前实例 —— 用普通函数 - 需要固定外层
this:比如回调、定时器、Promise 链中避免this丢失 —— 用箭头函数 - 注意陷阱:类字段中写箭头函数方法,
this指向类实例;但在对象字面量里写箭头函数,this很可能不是你预期的对象


















