ES6(ECMAScript 6)中的箭头函数(Arrow Function)是一种简化的函数定义语法,它采用了“=>”符号替代传统的“function”关键字来定义函数。箭头函数的完整形式可以表示为 (params) => expression
或 (params) => { statements }
。
箭头函数与传统(或称普通)函数之间的关键区别包括:
语法简洁:箭头函数的语法更为紧凑,尤其适合于简短的、单行表达式的场景。
// 传统函数 function add(a, b) { return a + b; } // 箭头函数 const add = (a, b) => a + b;
词法作用域的this:
- 箭头函数没有自己的
this
值,它会捕获其所在(即定义位置)上下文的this
值,且这个值在函数体内始终保持不变,因此不存在this
的动态绑定。 - 普通函数的
this
值取决于函数调用的上下文,可能是全局对象、调用函数的对象或者是new
操作符创建的新对象。
- 箭头函数没有自己的
没有arguments对象:
- 箭头函数不提供内置的
arguments
对象,若需访问类似功能,可以使用剩余参数(...rest
)。 - 普通函数可以通过
arguments
对象访问传入的所有参数,即使没有明确声明。
- 箭头函数不提供内置的
不能作为构造函数:
- 箭头函数不能使用
new
关键字调用,因为它没有[[Construct]]
内部方法,试图这样做会抛出错误。 - 普通函数可以作为构造函数,通过
new
创建新对象实例。
- 箭头函数不能使用
不改变this、super或new.target的绑定:
- 箭头函数内部的
this
、super
和new.target
总是引用其封闭上下文的对应值,不能通过call()
,apply()
, 或bind()
方法改变。 - 普通函数可以通过上述方法更改
this
的指向。
- 箭头函数内部的
不具有原型属性(prototype):
- 箭头函数没有
prototype
属性,因此不能定义方法供实例共享。 - 普通函数有
prototype
属性,可以用于面向对象编程,定义类和继承等。
- 箭头函数没有
不支持Generator函数:
- 箭头函数不能用作Generator函数,即不能使用
yield
关键字。 - 普通函数可以定义为Generator函数。
- 箭头函数不能用作Generator函数,即不能使用
综上所述,箭头函数更适合于不需要自己独立this
值、不需要arguments
对象并且不需要作为构造函数的情况。在涉及异步编程、回调函数、数组方法的高阶函数等方面,箭头函数因其简洁的语法和固定this
绑定的优势,得到了广泛应用。