箭头函数和函数表达式性能无实质差异,现代引擎已优化二者为相同匿名函数对象,执行效率、内存分配、JIT编译等均一致,选型应基于语义而非性能假设。

箭头函数和函数表达式在实际运行中几乎没有可测量的性能差异。现代 JavaScript 引擎(如 V8、SpiderMonkey)对两者做了高度优化,执行效率基本一致。真正影响性能的是代码逻辑、数据规模、调用频率等,而非函数定义形式本身。
内存分配行为相近
两者都属于函数表达式范畴(即非函数声明),均不会被提升,每次赋值都会生成一个函数对象。虽然有观点认为箭头函数“每次调用只创建新实例”,但这是误解——函数对象在定义时创建,调用时复用;是否复用取决于闭包捕获、作用域链长度等因素,与是否为箭头函数无关。
- 定义一次,多次调用:无论箭头还是函数表达式,函数对象仅创建一次
- 定义在循环内:两者都会在每次迭代中新建函数对象,造成同等开销
- 闭包变量引用:若捕获大量外部变量,两者内存占用无本质区别
this 和 arguments 不影响执行速度
所谓“箭头函数访问 this 更快”,源于它不进行动态绑定查找。但实际中,this 的解析开销极小,远低于一次属性访问或 DOM 操作。同理,arguments 对象的缺失并不提速——现代引擎早已对 arguments 做了优化,且多数场景下开发者改用 rest 参数(...args),其性能与箭头函数的参数接收方式完全一致。
- 普通函数中使用 arguments 并非必然慢;V8 对 arguments[0] 等简单访问做了内联优化
- 箭头函数省略 arguments 是语法限制,不是为提速而设计
- this 绑定差异属于语义层面,不影响字节码生成或 JIT 编译路径
引擎优化已抹平底层差别
V8 等引擎在编译阶段就将箭头函数和函数表达式统一处理为“匿名函数对象”。它们共享相同的调用机制、上下文管理、堆栈帧结构。Benchmarks(如 JSBench、Speedometer 子项)在主流浏览器中反复验证:在千次以上调用场景下,两者的平均执行时间波动在 ±0.5% 内,属于噪声范围。
- 函数体复杂度(如嵌套循环、正则匹配)对耗时的影响,远大于函数类型选择
- 首次调用可能触发 JIT 编译,但编译策略不区分箭头或 function 表达式
- Tree-shaking、minification 等构建环节对两者压缩效果也几乎相同
选箭头函数还是函数表达式,应基于语义清晰性、this 行为预期、团队规范,而不是性能假设。把精力放在减少重绘、优化算法、压缩资源上,收益要大得多。


















