箭头函数无独立执行上下文,故无自身this和arguments;普通函数有独立执行上下文,this动态绑定、arguments自动创建。

识别箭头函数和普通函数在 this 与 arguments 上的本质区别,关键不是记语法形式,而是看它们“有没有自己的执行上下文”。没有,就是箭头函数;有,就是普通函数。
看 this:是否随调用方式变化
普通函数的 this 是动态绑定的——它取决于函数怎么被调用:
- 作为对象方法调用(
obj.fn()),this 指向该对象 - 单独调用(
fn()),非严格模式下 this 指向 window / globalThis,严格模式下是 undefined - 用
call/apply/bind显式传入,this 可被修改
箭头函数没有自己的 this,它不响应任何调用方式或绑定操作:
- this 值在定义时就固定,取自外层第一个普通函数(或全局)的作用域
- 即使把它赋给对象属性、用
call调用,this 也不会变 - 外层没有普通函数时(如顶层定义),this 指向全局对象(浏览器中是
window)
看 arguments:是否自带参数集合
普通函数每次调用都会生成专属的 arguments 对象(类数组),可直接访问所有实参:
-
function sum() { return arguments[0] + arguments[1]; }✅ 可行 - 哪怕没写形参,
arguments依然存在且可用
箭头函数没有自己的 arguments:
- 函数体内写
arguments,会向上查找——找到外层普通函数的arguments,否则报错(ReferenceError) - 正确做法是用 rest 参数:
(...args) => args.reduce((a, b) => a + b) - 不能依赖
arguments.callee或类似递归技巧(ES5 常见写法,在箭头函数中完全失效)
一个快速验证方法
遇到一个函数,三步判断:
- 查定义:是不是
=>形式?是 → 优先怀疑为箭头函数 - 测
this:把它赋给对象属性后调用,输出this,若不是该对象 → 很可能是箭头函数 - 试
arguments:函数体里写console.log(arguments),若输出的是外层函数的参数或报错 → 基本确认是箭头函数
为什么这些区别重要
它们不是细节差异,而是设计哲学的体现:
- 普通函数是“完整执行单元”,拥有独立上下文,适合做方法、构造器、需要灵活绑定的场景
- 箭头函数是“轻量级表达式”,放弃自主上下文,换来词法
this和简洁性,天然适配回调、高阶函数、事件处理器 - 误把箭头函数当普通函数用(比如定义对象方法或构造器),会导致
this失效或new报错

















