箭头函数无this、不绑定arguments、不可new调用、无prototype、无new.target、无yield;单参数单表达式可省略return,但返回对象需括号包裹,否则解析为代码块。
this,会沿作用域链向上找这是最常踩坑的一点。传统函数的 this 在调用时动态绑定(取决于怎么被调用),而箭头函数
根本不绑定 this,它直接继承外层普通函数或全局作用域的 this 值。
典型错误场景:
obj.method = () => { console.log(this) } → this 不是 obj,而是定义时所在上下文的 this
button.addEventListener('click', () => { this.handleClick() }) → 如果想让 this 指向组件实例,必须确保外层函数已正确绑定 this,否则会报 undefined 或指向 window
call/apply/bind 试图改变箭头函数的 this —— 完全无效,因为箭头函数无视这些调用方式prototype
尝试用 new 调用箭头函数会直接抛出 TypeError: xxx is not a constructor。它没有 prototype 属性,也不支持原型链继承。
这意味着:
立即学习“Java免费学习笔记(深入)”;
render 写成箭头函数并期望它被实例化)instanceof 判断类型归属class
const Arrow = () => {};
console.log(Arrow.prototype); // undefined
new Arrow(); // TypeErrorarguments,也没有 new.target
在传统函数内部,arguments 是一个类数组对象,保存所有传入参数;箭头函数里访问 arguments,拿到的是外层函数的 arguments,或者报 ReferenceError(严格模式下)。
替代方案统一用剩余参数 ...args:
function traditional() {
console.log(arguments); // [1, 2, 3]
}
const arrow = (...args) => {
console.log(args); // [1, 2, 3]
};其他缺失特性还包括:
new.target:箭头函数中始终为 undefined,无法判断是否被 new 调用yield:不能用作生成器函数(没有 function* 对应的箭头语法)单参数 + 单表达式可省略括号和 return,但一旦返回对象字面量,必须加小括号,否则会被解析为代码块:
const getId = id => ({ id }); // ✅ 返回 { id: ... }
const getIdBroken = id => { id }; // ❌ 返回 undefined({ id } 是块级作用域,不返回)常见误写:
x => { x * 2 } → 没有 return,返回 undefined
() => { return { a: 1 } } → 正确,但不如 () => ({ a: 1 }) 简洁return,否则不会返回值这个细节在写 React 函数组件或 map 回调时极易出错。