前端面试中频率比较高的问题之一就是箭头函数 。
箭头函数表达式相比一般函数表达式来说更加简洁,更适用于那些需要匿名函数的地方。
但是,箭头函数没有自己的this,arguments,以及super和new.target。
因为没有this,所以就不能用作构造函数。
一般来讲,箭头函数的写法如下:
(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
//相当于:(param1, param2, …, paramN) =>{ return expression; }
// 当只有一个参数时,圆括号是可选的:
(singleParam) => { statements }
singleParam => { statements }
// 没有参数的函数应该写成一对圆括号。
() => { statements }
当需要返回对象字面量表达式时,记得为对象加上一对圆括号:
params => ({foo: bar})//没有圆括号会认为括号里是函数语句,从而导致报错
虽然不支持arguments,但是支持rest:
(param1, param2, ...rest) => { statements }
支持默认参数和参数列表解构:
(param1 = defaultValue1, param2, …, paramN = defaultValueN) => {
statements };
let f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
在通常的函数里,this一般会有这样几种情况:
- 如果该函数是一个构造函数,this 指针指向一个新的对象
- 在严格模式下的函数调用下,this 指向undefined
- 如果该函数是一个对象的方法,则它的 this 指针指向这个对象
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承 this。
由于 箭头函数没有自己的 this 指针,通过call()或apply()方法调用一个函数时,只能传递参数,不能绑定 this,他们的第一个参数会被忽略。
需要注意的几点:
- 箭头函数没有自己的this指针,所以和new一起使用会抛出错误。
- 箭头函数没有prototype属性。
- yield关键字通常不能在箭头函数中使用(除非是嵌套在允许使用的函数内)。因此,箭头函数不能用作函数生成器。
- 箭头函数在参数和箭头之间不能换行。
- 虽然箭头函数中的箭头不是运算符,但箭头函数具有与常规函数不同的特殊运算符优先级解析规则。