箭头函数与普通函数最核心区别在于this绑定方式不同:普通函数this由调用时决定,箭头函数继承定义时外层this;前者可作构造函数、支持arguments和prototype,后者不可。

箭头函数和普通函数最核心的区别不在写法简不简洁,而在于 this 绑定方式不同——这是几乎所有 bug 和误用的根源。选哪个,关键看你要不要控制 this,而不是“哪个更新潮”。
语法写法:只是表象,别被它带偏
箭头函数省略 function、return 和括号是事实,但这些只是糖衣:
- 单参数可不写括号:
x => x * 2 - 单表达式可不写花括号和 return:
(a, b) => a + b - 无参数必须写空括号:
() => console.log('hi') - 普通函数必须写
function关键字,且return不能省(除非返回undefined)
语法差异影响的是可读性和维护性,不是功能边界。
this 指向:决定你该用谁的根本原因
普通函数的 this 是调用时才确定的,谁调就指向谁;箭头函数没有自己的 this,它直接拿定义时外层作用域的 this,之后永远不变。
- 对象方法里用箭头函数 →
this不指向该对象,而是外层(通常是全局或上层函数),容易出undefined - 定时器、事件回调、Promise.then 里需要访问实例属性 → 箭头函数能自然保留
this,普通函数得靠bind或存that = this - 想用
call/apply/bind动态改this→ 只能用普通函数,箭头函数无视这些方法
功能限制:有些事箭头函数天生干不了
这不是缺陷,是设计取舍。以下场景普通函数不可替代:
-
不能当构造函数:
new () => {}直接报错,想创建实例必须用普通函数 -
没有
arguments:要用...args替代,否则在不明确参数个数的函数里会踩坑 -
没有
prototype:无法通过原型链添加方法,也不支持instanceof判断
怎么选:看用途,不看喜好
记住三个典型场景:
- 写对象方法(比如
obj.getName = function() {...})→ 用普通函数,保证this指向对象本身 - 写回调(
setTimeout、map、fetch().then)→ 优先用箭头函数,避免this丢失 - 要 new 出实例(
new User())、要动态绑定this、要兼容老旧 API → 必须用普通函数
不复杂但容易忽略:先问自己一句——这个函数执行时,this 应该是谁?答案清楚了,选择就出来了。











