ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function
(箭頭函數(shù))茬斧。
為什么叫Arrow Function
咱旱?因?yàn)樗亩x用的就是一個(gè)箭頭:
x => x * x
上面的箭頭函數(shù)相當(dāng)于:
function (x) {
return x * x;
}
特點(diǎn)
1.更簡(jiǎn)潔的語法
2.沒有this
3.不能使用new 構(gòu)造函數(shù)
4.不綁定arguments球碉,用rest參數(shù)...解決
5.使用call()和apply()調(diào)用
6.捕獲其所在上下文的 this 值,作為自己的 this 值
7.箭頭函數(shù)沒有原型屬性
8.不能簡(jiǎn)單返回對(duì)象字面量
9.箭頭函數(shù)不能當(dāng)做Generator函數(shù),不能使用yield關(guān)鍵字
10.箭頭函數(shù)不能換行
箭頭函數(shù)相當(dāng)于匿名函數(shù),并且簡(jiǎn)化了函數(shù)定義埋合。箭頭函數(shù)有兩種格式揍异,一種像上面的全陨,只包含一個(gè)表達(dá)式,連{ ... }
和return
都省略掉了衷掷。還有一種可以包含多條語句辱姨,這時(shí)候就不能省略{ ... }
和return
:
x => {
if (x > 0) {
return x * x;
}
else {
return - x * x;
}
}
如果參數(shù)不是一個(gè),就需要用括號(hào)()括起來:
// 兩個(gè)參數(shù):
(x, y) => x * x + y * y
// 無參數(shù):
() => 3.14
// 可變參數(shù):
(x, y, ...rest) => {
var i, sum = x + y;
for (i=0; i<rest.length; i++) {
sum += rest[i];
}
return sum;
}
如果要返回一個(gè)對(duì)象戚嗅,就要注意雨涛,如果是單表達(dá)式,這么寫的話會(huì)報(bào)錯(cuò):
// SyntaxError:
x => { foo: x }
因?yàn)楹秃瘮?shù)體的{ ... }
有語法沖突懦胞,所以要改為:
// ok:
x => ({ foo: x })
this
箭頭函數(shù)看上去是匿名函數(shù)的一種簡(jiǎn)寫替久,但實(shí)際上,箭頭函數(shù)和匿名函數(shù)有個(gè)明顯的區(qū)別:箭頭函數(shù)內(nèi)部的this是詞法作用域躏尉,由上下文確定蚯根。
回顧前面的例子,由于JavaScript函數(shù)對(duì)this綁定的錯(cuò)誤處理胀糜,下面的例子無法得到預(yù)期結(jié)果:
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = function () {
return new Date().getFullYear() - this.birth; // this指向window或undefined
};
return fn();
}
};
現(xiàn)在颅拦,箭頭函數(shù)完全修復(fù)了this
的指向蒂誉,this
總是指向詞法作用域,也就是外層調(diào)用者obj
:
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向obj對(duì)象
return fn();
}
};
obj.getAge(); // 25
如果使用箭頭函數(shù)距帅,以前的那種hack寫法:
var that = this;
就不再需要了右锨。
由于this
在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以碌秸,用call()
或者apply()
調(diào)用箭頭函數(shù)時(shí)绍移,無法對(duì)this
進(jìn)行綁定,即傳入的第一個(gè)參數(shù)被忽略:
var obj = {
birth: 1990,
getAge: function (year) {
var b = this.birth; // 1990
var fn = (y) => y - this.birth; // this.birth仍是1990
return fn.call({birth:2000}, year);
}
};
obj.getAge(2015); // 25
箭頭函數(shù)沒有原型屬性
var a = ()=>{
return 1;
}
function b(){
return 2;
}
console.log(a.prototype); // undefined
console.log(b.prototype); // {constructor: ?}