箭头函数不是语法糖,它与function函数在this绑定、arguments对象、new调用等方面存在本质区别:无独立this(继承外层)、无arguments、不可new调用、不支持generator/async generator,单表达式隐式返回需注意对象字面量括号。
箭头函数不是语法糖,它和 function 关键字声明的函数在 this、arguments、new 调用等行为上有本质区别,不能随意替换。
this,始终继承外层作用域的 this
这是最常踩坑的一点。传统函数的 this 取决于调用方式(如 obj.fn() 中 this 指向 obj),而箭头函数的 this 在定义时就固定了,无法被 .call()、.apply()、.b 改变。
ind()
() => this.xxx,如果外层 this 是 undefined(严格模式)或全局对象,就会出错;应改用 function() { this.xxx } 或提前绑定methods 中禁止使用箭头函数,否则 this 指向不是组件实例onClick={() => this.handleClick()}),每次渲染都新建函数,可能触发子组件不必要的重渲染(可用 useCallback 优化)arguments 对象,也不支持 new 调用它无法访问 arguments,也不能作为构造函数——调用 new 会直接抛出 TypeError: xxx is not a constructor。
(...args) => args[0] 替代 function() { return arguments[0]; }
function 或 class,箭头函数完全不可行function*)和异步函数(async function)都不能写成箭头形式:async () => {} 合法,但 async () => yield 1 语法错误{} 和 return
很多人以为 () => 1 和 () => { 1 } 等价,其实后者不返回任何值(即返回 undefined)。
x => x * 2;但无参或多个参数必须写:() => 0、(a, b) => a + b
x => ({ id: x }) —— 注意括号要包住对象字面量,否则会被解析为代码块undefined,这种 bug 很隐蔽const objFactory = (id) => { id: id }; // ❌ 返回 undefined
const objFactory = (id) => ({ id: id }); // ✅ 返回 { id: id }真正难的不是记住规则,而是判断「这里该不该用箭头函数」——关键看是否依赖动态 this、是否需要被 new、是否要访问 arguments。其他时候,它只是更简洁的函数写法而已。