公司要開小程序的項目了沼沈,領(lǐng)導讓提前熟悉下es6的語法,學習中遇到箭頭函數(shù)相關(guān)的一段代碼箕别,起初對輸出結(jié)果不是很理解,重新看了箭頭函數(shù)的相關(guān)概念后才有一點兒明白驴剔。
如下代碼:
function Timer() {
this.s1 = 0;
this.s2 = 0;
// 箭頭函數(shù)
setInterval(() => this.s1++, 1000);
// 普通函數(shù)
setInterval(function () {
this.s2++;
}, 1000);
}
var timer = new Timer();
setTimeout(() => console.log('s1: ', timer.s1), 3100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);
上面代碼中,Timer函數(shù)內(nèi)部設(shè)置了兩個定時器粥庄,分別使用了箭頭函數(shù)和普通函數(shù),然后用setTimeout函數(shù)延遲3100毫秒后執(zhí)行丧失。
最后輸出結(jié)果是:
s1: 3
s2: 0
可以看到,3100毫秒之后飒赃,timer.s1被更新了3次利花,而timer.s2一次都沒更新。為什么會這樣载佳?
因為:前者的this綁定定義時所在的作用域(即Timer函數(shù)),后者的this指向運行時所在的作用域(即全局對象)
箭頭函數(shù)中的this.綁定的是Timer函數(shù)中的s1變量臀栈,所以每隔一秒鐘s1的值會被更新蔫慧,但是在普通函數(shù)中,this指代的是全局對象权薯,放到瀏覽器姑躲,全局對象是window,在node就是global.s2盟蚣。在上邊兒這段代碼中黍析,并沒有在全局定義s2變量,所以this.s2++其實沒有什么作用屎开,如果在這里將s2打印一下:
// 普通函數(shù)
setInterval(function () {
this.s2++;
console.log(this.s2);
}, 1000);
會發(fā)現(xiàn)阐枣,輸出的是NaN.
如果增加一個全局變量,如下:
window.s2 = 0;
在瀏覽器中再次執(zhí)行奄抽,就會發(fā)現(xiàn)this.s2可以打印出值了蔼两。
屏幕快照 2017-07-06 下午6.00.57.png