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函數。
相關文章
相關標籤/搜索