箭头函数使用注意事项

"关于箭头函数使用注意事项"

Posted by zhenqili on October 27, 2018

箭头函数使用注意事项

关于this

箭头函数不会创建自己的this,只会从自己的作用域链的上一层继承this,this是词法层面的。
所以call,apply,bind的使用在箭头函数中无效。

    function Person() {
        this.name = 'zhangsan';
        setTimeout( () => {
            console.log(this.name); //上一层作用域就是Person构造函数,所以this.name 就是zhangsan
        }, 1000)
    }

不绑定arguments,使用剩余参数来代替

没有prototype属性

    let Foo = () => {}
    console.log(Foo.prototype) // undefined

yield 关键字不能在箭头函数中使用

函数体

可以有一个“简写体”或常见的“块体”。简写体中只需要一个表达式,并附加一个隐式的返回值,块体中,要有明确的return语句

// 1. 简写函数 省略return
let func = x => x * x;                  
//但是如果是返回值是对象的话,需要圆括号括起来,否则对象的大括号会被误认为常规写法的大括号
let func = () => {foo: 1}; //❌ 错误写法,大括号会被误认为常规写法的大括号,里面的值“foo:1”表达就不正确了
let func = () => ({foo: 1}); //✅ 正确的写法,用圆括号包括对象返回
 

//2. 常规编写 明确的返回值
let func = (x, y) => { return x + y; }; 

箭头函数在参数和箭头之间不能换行

let func = ()
           => 1; 
// SyntaxError: expected expression, got '=>'

不能使用new

箭头函数不能作构造器,和new一起使用会报错, 这跟箭头函数没有创建this也有关

let Foo = () => {};
let foo = new Foo(); //TypeError: Foo is not a  constructor

解析顺序

虽然箭头函数中的箭头不是运算符,但箭头函数具有与常规函数不同的特殊运算符优先级解析规则。

let callback;

callback = callback || function() {}; // ok

callback = callback || () => {};      
// SyntaxError: invalid arrow-function arguments

callback = callback || (() => {});    // ok