JavaScript函数有三种定义方式:函数声明、函数表达式和箭头函数;前者具提升性且可作构造函数,后两者不可;箭头函数无this、arguments、prototype,适合回调等无需动态绑定的场景。

JavaScript 中函数主要有三种定义方式:函数声明、函数表达式(含匿名函数)、箭头函数。它们在语法、this 绑定、arguments 支持、new 调用能力等方面有本质区别。
常见函数定义方式
函数声明:使用 function 关键字 + 函数名,会被提升(hoisted),可提前调用。
function sayHello() {
return "Hello";
}函数表达式:将函数赋值给变量,不被提升(仅变量声明提升),调用需在定义之后。
const sayHi = function() {
return "Hi";
};箭头函数:ES6 引入的简写形式,没有自己的 this、arguments,不能用作构造函数。
立即学习“Java免费学习笔记(深入)”;
const greet = () => "Hey";
箭头函数与普通函数的核心区别
- this 指向不同:普通函数的 this 取决于调用方式(如 obj.method() 中 this 指向 obj);箭头函数没有自己的 this,它继承外层作用域的 this 值,且不可通过 call/apply/bind 修改。
-
没有 arguments 对象:普通函数内部可访问
arguments类数组;箭头函数中访问会报错,需用剩余参数...args替代。 -
不能作为构造函数:箭头函数没有 prototype,调用
new fn()会抛出 TypeError;普通函数可以。 -
没有 new.target:箭头函数中
new.target始终为 undefined,无法判断是否被 new 调用。 -
没有原型属性(prototype):普通函数默认有
fn.prototype,用于实现原型链继承;箭头函数没有该属性。
什么时候该用箭头函数?
适合用于:不需要独立 this、不需 arguments、不需 new 实例化 的场景,比如:
-
回调函数(如
array.map(x => x * 2)、setTimeout(() => {...}, 100)) - 简化短小逻辑,避免手动绑定 this(如 React 事件处理器中避免
bind(this)) - 闭包中保持外层 this 上下文(如定时器、异步操作中引用组件实例)
什么时候必须用普通函数?
需要以下任一特性时,必须使用普通函数(function 声明或表达式):
- 方法需动态绑定 this(如对象方法、事件监听器需指向触发元素)
- 要用
arguments处理不定参数(尽管推荐用...rest) - 要通过
new创建实例(如自定义类、工具构造器) - 要利用
prototype实现继承或共享方法 - 需要使用
yield写 generator 函数(箭头函数不支持)











