一、核心区别对比
特性 | 普通函数 | 箭头函数 |
---|---|---|
this 绑定 |
动态绑定(由调用方式决定) | 词法绑定(定义时确定) |
构造函数能力 | 可用 new 调用 |
不可用 new 调用 |
arguments 对象 |
存在 | 不存在(需用 ...args ) |
prototype 属性 |
存在 | 不存在 |
语法简洁性 | 标准语法 | 更简洁(尤其单行时) |
二、设计意义解析
- 消除函数二义性
-
- 传统函数的双重身份:
csharp
function foo() {}
// 1. 作为指令序列直接调用:foo()
// 2. 作为构造器通过 new 调用:new foo()
-
- ES6 的明确分工:
-
-
class
专用于面向对象(必须用new
)- 箭头函数专用于过程式编程(禁止用
new
)
-
- 简化函数作用域
javascript
// 传统问题
const obj = {
value: 1,
getValue: function() {
setTimeout(function() {
console.log(this.value); // undefined(this指向window)
}, 100);
}
};
// 箭头函数解决方案
const obj = {
value: 1,
getValue: function() {
setTimeout(() => {
console.log(this.value); // 1(继承外层this)
}, 100);
}
};
-
- 解决传统函数
this
绑定的混乱问题:
- 解决传统函数
三、使用场景指南
✅ 优先使用箭头函数:
- 需要保持
this
一致的场景(如回调函数) - 简单的纯函数/工具函数
- 函数式编程(map/filter/reduce等)
✅ 必须使用普通函数:
- 需要作为构造函数时
- 对象方法(需要动态
this
时) - 需要访问
arguments
对象时 - 生成器函数(
function*
)
四、典型示例对比
javascript
// 传统构造函数
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log(`Hi, I'm ${this.name}`);
};
// 现代替代方案(ES6+)
class Person {
constructor(name) {
this.name = name;
}
sayHi() {
console.log(`Hi, I'm ${this.name}`);
}
}
// 纯功能函数(适合箭头函数)
const add = (a, b) => a + b;
const double = x => x * 2;
五、关键总结
- 箭头函数是无副作用的纯函数载体
- 普通函数是面向对象编程的基础单元
- ES6 通过
class
和箭头函数实现了:
-
- 面向对象与过程式编程的语法分离
- 更可靠的
this
绑定机制 - 更简洁的函数表达式
这样的结构调整使得:
- 区别对比更直观(表格呈现)
- 设计目的更明确(单独章节)
- 使用建议更实用(场景化指南)
- 代码示例更典型(对比演示)