函数声明不能直接转为箭头函数,须先改为函数表达式(如 const add = function(a, b) { return a + b; };),再转为箭头函数(const add = (a, b) => a + b);含 this、new 调用、arguments 或递归的函数不可安全转换。

可以,但函数声明本身不能直接变成箭头函数,必须先转为函数表达式,再改写为箭头函数。
因为箭头函数本质上是函数表达式的一种简写形式,它没有函数名、不支持函数提升,也不能用 function 关键字声明。而函数声明(function foo() {})具有提升(hoisting)特性,语法结构和行为都与箭头函数不兼容。
怎么转换?分两步走
第一步:把函数声明改成函数表达式
把function name(params) { ... }改成const name = function(params) { ... };
(注意加;,且推荐用const声明)第二步:把函数表达式转为箭头函数
去掉function关键字,加上=>,按规则简化括号和大括号
例如:
- 原函数声明:
function add(a, b) { return a + b; } - 转为函数表达式:
const add = function(a, b) { return a + b; }; - 再转箭头函数:
const add = (a, b) => a + b;
哪些函数声明不能安全转换?
以下情况转成箭头函数会出问题,需特别注意:
-
含 this 的方法:比如对象里的方法(
obj.method = function() { console.log(this); }),转成箭头函数后,this指向外层作用域,不再是调用时的对象 -
需要被 new 调用的构造函数:箭头函数不能作为构造函数,
new (() => {})会报错 -
使用 arguments 的函数:箭头函数没有
arguments对象,得改用剩余参数...args - 递归函数(用自身名字调用):箭头函数没函数名,无法在内部直接调用自己(除非用变量名 + 间接引用)
常见简写规则要记牢
转换时顺手优化,让代码更简洁:
- 单个参数:可省括号,如
x => x * 2 - 无参数:必须写空括号,如
() => console.log('hi') - 单行返回值:省略大括号和 return,如
a => a > 0 - 返回对象字面量:必须用小括号包裹,如
() => ({ id: 1, name: 'A' })(否则 `{}` 被当函数体)
不复杂但容易忽略


















