es6中箭頭函數學習的一個記錄

公司要開小程序的項目了,領導讓提前熟悉下es6的語法,學習中遇到箭頭函數相關的一段代碼,起初對輸出結果不是很理解,重新看了箭頭函數的相關概念后才有一點兒明白。

如下代碼:

function Timer() {
  this.s1 = 0;
  this.s2 = 0;
  // 箭頭函數
  setInterval(() => this.s1++, 1000);
  // 普通函數
  setInterval(function () {
    this.s2++;
  }, 1000);
}

var timer = new Timer();

setTimeout(() => console.log('s1: ', timer.s1), 3100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);

上面代碼中,Timer函數內部設置了兩個定時器,分別使用了箭頭函數和普通函數,然后用setTimeout函數延遲3100毫秒后執行。
最后輸出結果是:

s1: 3
s2: 0

可以看到,3100毫秒之后,timer.s1被更新了3次,而timer.s2一次都沒更新。為什么會這樣?

因為:前者的this綁定定義時所在的作用域(即Timer函數),后者的this指向運行時所在的作用域(即全局對象)

箭頭函數中的this.綁定的是Timer函數中的s1變量,所以每隔一秒鐘s1的值會被更新,但是在普通函數中,this指代的是全局對象,放到瀏覽器,全局對象是window,在node就是global.s2。在上邊兒這段代碼中,并沒有在全局定義s2變量,所以this.s2++其實沒有什么作用,如果在這里將s2打印一下:

// 普通函數
    setInterval(function () {
        this.s2++;
        console.log(this.s2);
    }, 1000);

會發現,輸出的是NaN.
如果增加一個全局變量,如下:

window.s2 = 0;

在瀏覽器中再次執行,就會發現this.s2可以打印出值了。


屏幕快照 2017-07-06 下午6.00.57.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 函數參數的默認值 基本用法 在ES6之前,不能直接為函數的參數指定默認值,只能采用變通的方法。 上面代碼檢查函數l...
    呼呼哥閱讀 3,476評論 0 1
  • 基本語法 ES6 允許使用“箭頭”(=>)定義函數。 上面的箭頭函數相當于: 如果箭頭函數不需要參數或需要多個參數...
    iyimao閱讀 695評論 0 6
  • 開發過程中遇到的一些奇妙的事情:(基礎知識,碰到了忘了又百度了又怕忘了就記下來了)注:此篇文章是我參考阮一峰老師的...
    HW_____T閱讀 269評論 0 0
  • 一. 函數參數的默認值 ES6 允許為函數的參數設置默認值,即直接寫在參數定義的后面。 Tips:參數變量是默認聲...
    markpapa閱讀 250評論 0 0
  • 1培訓了八段錦,自己要堅持每天練練,讓自己擁有個好身體。 2人都要學會感恩,當你懂得感恩后,會收獲很多的正知正見。...
    青心爭己閱讀 2,403評論 0 0