天天看点

前端面试之箭头函数

前端面试中频率比较高的问题之一就是箭头函数 。

箭头函数表达式相比一般函数表达式来说更加简洁,更适用于那些需要匿名函数的地方。

但是,箭头函数没有自己的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,他们的第一个参数会被忽略。

需要注意的几点:

  1. 箭头函数没有自己的this指针,所以和new一起使用会抛出错误。
  2. 箭头函数没有prototype属性。
  3. yield关键字通常不能在箭头函数中使用(除非是嵌套在允许使用的函数内)。因此,箭头函数不能用作函数生成器。
  4. 箭头函数在参数和箭头之间不能换行。
  5. 虽然箭头函数中的箭头不是运算符,但箭头函数具有与常规函数不同的特殊运算符优先级解析规则。

继续阅读