javascript箭头函数是什么_它和普通函数有什么区别

箭头函数是ES6引入的简洁函数语法,不绑定this/arguments/super/new.target,而是继承外层词法作用域;不能作为构造函数,无prototype,不支持new调用;无arguments但可用...args替代;不可用作Generator函数;适用于需保持this一致性的回调场景。

箭头函数是 ES6 引入的一种简洁的函数定义方式,用 => 符号表示。它不是普通函数的简单缩写,而是在设计上就与传统函数有本质差异——最核心的区别在于 不绑定自己的 thisargumentssupernew.target,而是继承外层作用域的值。

箭头函数没有独立的 this

普通函数的 this 取决于调用方式(如对象方法调用、call/apply、事件回调等),而箭头函数的 this 始终等于定义时所在词法作用域的 this,不会被调用方式改变。

常见场景:在事件监听或定时器中避免 this 丢失:

  • 普通函数需手动绑定:btn.addEventListener('click', function() { this.doSomething(); }.bind(this));
  • 箭头函数自动继承:btn.addEventListener('click', () => this.doSomething());

箭头函数不能作为构造函数

它没有 prototype 属性,也不支持 new 调用。试图用 new 实例化箭头函数会直接报错 TypeError: xxx is not a constructor

这意味着箭头函数不适合用来定义需要通过 new 创建实例的类或工厂逻辑。

箭头函数没有 arguments 对象

普通函数内部可访问 arguments 类数组对象来获取所有实参;箭头函数没有该对象,但可以使用更现代的剩余参数(...args)替代:

  • 普通函数:function f() { console.log(arguments[0]); }
  • 箭头函数:const f = (...args) => console.log(args[0]);

其他细节差异

箭头函数还有几个实用但易忽略的特点:

  • 不能使用 yield,因此不能用作 Generator 函数
  • 没有 new.target,无法检测是否被 new 调用
  • 简写形式省略花括号和 return 时,会隐式返回表达式结果(如 x => x * 2
  • 单参数时可省略括号(x => x + 1),但无参或多个参数必须加括号(() => 0(a, b) => a + b

不复杂但容易忽略:选箭头函数还是普通函数,关键看是否需要动态 this 或构造能力。需要绑定上下文或当构造器时,用普通函数;追求简洁、保持外层 this 或写回调时,箭头函数更安全自然。