JavaScript中的箭头函数是ES6新增的函数定义语法,和普通函数在多个核心特性上存在明显差异,这些差异会直接影响函数的使用场景和代码运行结果。

一、定义语法差异
普通函数的定义方式较为多样,支持函数声明和函数表达式两种形式,而箭头函数仅支持函数表达式形式,且语法更为简洁。
普通函数的定义示例如下:
// 函数声明
function normalFunc1(a, b) {
return a + b;
}
// 函数表达式
const normalFunc2 = function(a, b) {
return a + b;
};
箭头函数的定义示例如下:
// 基础语法
const arrowFunc1 = (a, b) => {
return a + b;
};
// 单参数可省略括号
const arrowFunc2 = a => {
return a * 2;
};
// 函数体只有返回语句可省略大括号和return
const arrowFunc3 = (a, b) => a + b;
二、this指向规则差异
这是两者最核心的区别,普通函数的this指向在运行时动态确定,而箭头函数没有自己的this,它的this继承自外层作用域的this。
普通函数的this指向取决于函数的调用方式:
const obj = {
name: '测试对象',
normalMethod: function() {
console.log(this.name); // 调用时this指向obj,输出 测试对象
}
};
obj.normalMethod();
const func = obj.normalMethod;
func(); // 作为普通函数调用,this指向全局对象(非严格模式)或undefined(严格模式)
箭头函数的this绑定在定义时就已经确定,不会随调用方式改变:
const obj = {
name: '测试对象',
arrowMethod: () => {
console.log(this.name); // 定义时this继承自外层作用域,此处外层为全局,输出空或undefined
}
};
obj.arrowMethod();
const func = obj.arrowMethod;
func(); // this依然指向定义时的外层作用域,不会变化
三、arguments对象支持差异
普通函数内部自带arguments对象,用于获取所有传入的参数,而箭头函数没有自己的arguments对象,若需要使用参数集合,可通过剩余参数语法实现。
普通函数使用arguments的示例:
function normalFunc() {
console.log(arguments); // 输出所有传入的参数组成的类数组对象
}
normalFunc(1, 2, 3); // 打印 Arguments(3) [1, 2, 3]
箭头函数无法使用arguments,使用剩余参数的替代方案:
const arrowFunc = (...args) => {
console.log(args); // 输出所有传入的参数组成的数组
};
arrowFunc(1, 2, 3); // 打印 [1, 2, 3]
四、构造函数与prototype属性差异
普通函数可以作为构造函数使用,通过new关键字创建实例,同时普通函数自带prototype属性;而箭头函数不能作为构造函数,使用new调用会报错,也没有prototype属性。
普通函数作为构造函数的示例:
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
};
const p = new Person('张三');
p.sayName(); // 输出 张三
console.log(Person.prototype); // 输出对应的原型对象
箭头函数作为构造函数调用的示例:
const ArrowPerson = (name) => {
this.name = name;
};
// 以下代码会报错:ArrowPerson is not a constructor
// const p = new ArrowPerson('李四');
console.log(ArrowPerson.prototype); // 输出 undefined
五、适用场景总结
根据两者的特性差异,可按照以下场景选择使用:
- 需要使用this动态指向、作为构造函数、使用arguments对象的场景,优先选择普通函数
- 作为回调函数、需要固定this指向、编写简洁的工具函数场景,优先选择箭头函数
- 对象方法定义时,若方法内部需要使用对象自身的this,不要使用箭头函数
注意:箭头函数的简洁语法虽然好用,但不要盲目替换所有普通函数,需结合具体场景的特性要求合理选择。
JavaScript箭头函数普通函数this指向函数定义修改时间:2026-06-16 04:21:38