更短的函数写法

ES6 引入的箭头函数(=>)让我们用更短的语法写函数。同样是"把数字加一":

// 普通函数
function addOne(n) {
  return n + 1;
}

// 箭头函数
const addOne2 = (n) => {
  return n + 1;
};

// 只有一句 return 时,还能再短
const addOne3 = n => n + 1;

console.log(addOne3(2));  // 输出:3

只有一个参数时括号可以省,函数体只有一句时大括号和 return 都能省。回调里最常见这种单行写法:

const nums = [3, 1, 4, 1, 5];
const doubled = nums.map(n => n * 2);
console.log(doubled);  // 输出:[6, 2, 8, 2, 10]

多参数与无参数

参数不止一个时括号必须写;没有参数时写一对空括号:

const add = (a, b) => a + b;
console.log(add(2, 3));  // 输出:5

const sayHi = () => console.log("嗨!");
sayHi();  // 输出:嗨!

返回对象的小坑

想直接返回一个对象字面量,外层必须包一层圆括号,否则大括号会被当成函数体而不是对象:

const makeUser = (name, age) => ({ name, age });

console.log(makeUser("小雪", 20));
// 输出:{ name: '小雪', age: 20 }

最大的区别:没有自己的 this

普通函数的 this 由"谁调用"决定,箭头函数没有自己的 this,直接用外层的 this。这一点在回调理特别有用:

const counter = {
  count: 0,
  start() {
    setInterval(() => {
      this.count++;
      console.log(this.count);
    }, 1000);
  }
};

counter.start();
// 每秒输出:1、2、3…… this 一直指向 counter

如果把这里的箭头函数换成普通 function,this 就不再指向 counter,count 的自增会出问题。反过来,定义对象方法时也不适合用箭头函数,因为方法里的 this 会指向外层而不是对象本身。

不能用的场合

箭头函数有几个限制要记住:不能当构造函数(不能 new)、没有自己的 arguments 对象、不适合做对象方法和原型方法。把它当"短小的回调工具"来用,基本不会出错。

与普通函数如何选择

日常给 map、filter 这类方法传回调,箭头函数几乎是默认选择;而对象的方法、需要用 this 的场景,继续用普通函数。判断标准很简单:需不需要自己的 this,逻辑是不是单行。

小结

箭头函数的核心就两点:写法更短,适合单行回调;没有自己的 this,会沿用外层作用域。日常给 map、filter、setTimeout 这类 API 传回调时优先用它;对象方法和需要独立 this 的场景继续用普通函数,两者搭配着用最舒服。