箭头函数与普通函数区别全解析
时间:2026-03-14 12:52:34 501浏览 收藏
JavaScript箭头函数虽简洁优雅,却与普通函数存在本质差异:它不绑定自身this(而是继承外层作用域)、不可用new构造、没有arguments和yield支持,且返回值规则隐晦——单表达式自动返回,但对象字面量必须用小括号包裹,否则被误解析为代码块而返回undefined;这些特性看似便利,实则暗藏诸多“坑”,稍不注意就会引发this指向错误、构造失败、参数访问异常或意外undefined返回,掌握它们的区别不仅是写出正确代码的关键,更是避免线上事故的必备基础。

箭头函数没有自己的 this
这是最常踩坑的一点:箭头函数不绑定自己的 this,而是沿用外层作用域的 this 值。普通函数每次调用时会根据调用方式(如 obj.fn()、fn.call(obj))动态确定 this。
典型问题场景:
- 对象方法中写箭头函数 →
this指向外层(通常是window或undefined,严格模式下) - 事件回调里用箭头函数 → 本意是绑定当前实例,但若外层
this不对,就失效 - 想用
call/apply强制改变this→ 对箭头函数完全无效
示例:
const obj = {
name: 'Alice',
regular() { return this.name },
arrow: () => this.name
};
obj.regular(); // 'Alice'
obj.arrow(); // undefined(非严格模式下可能是 window.name)
箭头函数不能作为构造函数
调用 new 箭头函数会直接抛出 TypeError: xxx is not a constructor。因为箭头函数没有 [[Construct]] 内部方法,也没有 prototype 属性。
这意味着:
- 不能用
new实例化 - 不能用在需要原型链继承的场景(如 Class 的静态方法中返回新实例时需谨慎)
- 无法通过
instanceof判断类型(它连prototype都没有)
替代方案:必须用普通函数或 class 定义构造逻辑。
箭头函数没有 arguments,也不支持 yield
箭头函数内部访问 arguments 会报 ReferenceError,因为它不创建自己的 arguments 对象。同理,它不能用 yield,因此不能作为 Generator 函数。
常见应对方式:
- 用剩余参数
...args替代arguments - 需要
yield就必须改用function*声明 - 在需要动态参数处理又想用箭头函数时,得提前把参数收进数组再传入
示例:
const bad = () => console.log(arguments); // ReferenceError const good = (...args) => console.log(args); // ✅
箭头函数的返回值隐式规则容易误判
当箭头函数体是单个表达式且省略大括号时,会自动返回该表达式的值;但一旦用了大括号,就必须显式写 return,否则返回 undefined。
这个差异在对象字面量返回时尤其危险:
x => ({a: 1})→ 正确返回对象(小括号避免被解析为代码块)x => {a: 1}→ 返回undefined(这其实是代码块,a: 1是标签语句)x => ({a: 1})和x => return {a: 1}看似一样,但后者语法错误(箭头函数里不能用return关键字除非有大括号)
最容易忽略的是:对象字面量必须包裹在小括号里,否则 JS 解析器会把它当作函数体的开始。
本篇关于《箭头函数与普通函数区别全解析》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!
相关阅读
更多>
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
174 收藏
-
426 收藏
-
283 收藏
-
327 收藏
-
127 收藏
-
411 收藏
-
.card-cont" class="aBlack">CSS动画实现卡片滑动效果的关键在于使用 transform: translate 结合 @keyframes。以下是详细步骤和示例代码,帮助你理解如何在卡片滑动中应用 CSS 动画。一、基本结构首先,创建一个包含卡片的容器,并为卡片设置基础样式:.card-cont卡片内容
484
收藏
395
收藏
316
收藏
191
收藏
147
收藏
142
收藏