1植阴、箭頭函數(shù)
ES6 允許使用箭頭函數(shù)捧搞。
var f = v => v;
// 等同于
var f = function (v) {
return v;
};
如果箭頭函數(shù)不需要參數(shù)或需要多個(gè)參數(shù),就使用一個(gè)圓括號(hào)代表參數(shù)部分健民。
var f = () => 5;
// 等同于
var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};
使用注意點(diǎn):
1抒巢,函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象秉犹,而不是使用時(shí)所在的對(duì)象蛉谜。
2,不可以當(dāng)作構(gòu)造函數(shù)崇堵,也就是說型诚,不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤鸳劳。
3狰贯,不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在赏廓。如果要用涵紊,可以用 rest 參數(shù)代替。
4楚昭,不可以使用yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù)拍顷。
上面四點(diǎn)中抚太,第一點(diǎn)尤其值得注意。this對(duì)象的指向是可變的昔案,但是在箭頭函數(shù)中尿贫,它是固定的。
function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
}
var id = 21;
foo.call({ id: 42 });
// id: 42
上面代碼中踏揣,setTimeout的參數(shù)是一個(gè)箭頭函數(shù)庆亡,這個(gè)箭頭函數(shù)的定義生效是在foo函數(shù)生成時(shí),而它的真正執(zhí)行要等到 100 毫秒后捞稿。如果是普通函數(shù)又谋,執(zhí)行時(shí)this應(yīng)該指向全局對(duì)象window,這時(shí)應(yīng)該輸出21娱局。但是彰亥,箭頭函數(shù)導(dǎo)致this總是指向函數(shù)定義生效時(shí)所在的對(duì)象(本例是{id: 42}),所以輸出的是42衰齐。
箭頭函數(shù)可以讓setTimeout里面的this任斋,綁定定義時(shí)所在的作用域,而不是指向運(yùn)行時(shí)所在的作用域.
不實(shí)用的場景
由于箭頭函數(shù)使得this從“動(dòng)態(tài)”變成“靜態(tài)”耻涛,下面兩個(gè)場合不應(yīng)該使用箭頭函數(shù)废酷。
第一個(gè)場合是定義函數(shù)的方法瘟檩,且該方法內(nèi)部包括this。
const cat = {
lives: 9,
jumps: () => {
this.lives--;
}
}
上面代碼中澈蟆,cat.jumps()方法是一個(gè)箭頭函數(shù)墨辛,這是錯(cuò)誤的。調(diào)用cat.jumps()時(shí)丰介,如果是普通函數(shù)背蟆,該方法內(nèi)部的this指向cat;如果寫成上面那樣的箭頭函數(shù)哮幢,使得this指向全局對(duì)象带膀,因此不會(huì)得到預(yù)期結(jié)果。