Arrow Function(箭頭函數(shù))养铸。
ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))。
為什么叫Arrow Function?因?yàn)?strong>它的定義用的就是一個(gè)箭頭:
一太援、寫法之一:
x => x * x
上面的箭頭函數(shù)相當(dāng)于:
function (x) {
return x * x;
}
在繼續(xù)學(xué)習(xí)箭頭函數(shù)之前笋敞,請(qǐng)測(cè)試你的瀏覽器是否支持ES6的Arrow Function:
'use strict';
var fn = x => x * x;
alert('你的瀏覽器支持ES6的Arrow Function!');
箭頭函數(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ù)體的{ ... }有語法沖突黔漂,所以要加括號(hào):
// 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(); // 27
如果使用箭頭函數(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