ES6箭头函数

语法:express

([param] [, param]) => {
   statements
}
 
param => expression

使用:app

(  )=>{···}; //零个参数用()表示
  x  =>{···}; //一个参数,能够省略() 
 (x,y)=>{···}; //多个参数不能省略()

 **多行语句须要用{}括起来,单行表达式不须要{},而且会做为函数返回值。**

特性:函数

箭头函数内部没有constructor方法,也没有prototype,因此不支持new操做。可是它对this的处理与通常的普通函数不同。箭头函数的 this 始终指向函数定义时的 this,而非执行时this

例如:prototype

var o = {
    x : 1,
    fn : function() { console.log(this.x) },
    test : function() {
        setTimeout(function() {
            this.fn();
        }, 100);
    }
};

o.test(); // TypeError : this.fn is not a function

上面的代码会出现错误,由于this的指向从o变为了全局(函数调用中的this都是指向全局的)。code

要修改上面的代码以下:对象

var o = {
    x : 1,
    fn : function() { console.log(this.x) },
    test : function() {
        var _this = this;
        setTimeout(function() {
            _this.fn(); 
        }, 100);
    }
};
o.test();

经过使用外部事先保存的this就好了。作用域

利用到箭头函数修改,箭头函数的 this 始终指向函数定义时的 this,而非执行时get

var o = {
    x : 1,
    fn : function() { console.log(this.x) },
    test : function() {
        setTimeout(() => { this.fn() }, 100);
    }
};

o.test();

这回this就指向o了。箭头函数可让setTimeout里面的this,绑定定义时所在的做用域,而不是指向运行时所在的做用域。io

上面代码中,转换后的ES5版本清楚地说明了,箭头函数里面根本没有本身的this,而是引用外层的this。

须要注意一点的就是箭头函数中的this是不会改变指向对象的,咱们知道call和apply能够改变this的指向,可是在箭头函数中是无效的。

var x = 1,
       o = {
           x : 10,
           test : () => {
               console.log(this);//window函数调用中的this都是指向全局的
               return this.x
            }
       };
   console.log(o.test()); // 1
   console.log(o.test.call(o)); // 依然是1

若是箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,而且使用return语句返回。

var sum = (num1, num2) => { return num1 + num2; }

因为大括号被解释为代码块,因此若是箭头函数直接返回一个对象必须在对象外面加上括号
var getTempItem = id => ({ id: id, name: "Temp" });

使用注意点

  • 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
  • 不能够看成构造函数,也就是说,不可使用new命令,不然会抛出一个错误。
  • 不可使用arguments对象,该对象在函数体内不存在。若是要用,能够用Rest参数代替。
  • 不可使用yield命令,所以箭头函数不能用做Generator函数。
相关文章
相关标签/搜索