es6中,“=>”是指箭頭函數(shù),是一種函數(shù)的簡寫方式,語法為(參數(shù))=>{函數(shù)體};”。箭頭函數(shù)沒原型,沒this、arguments、super和“new.target”綁定,其值由外圍最近一層非箭頭函數(shù)決定;也不能通過new關(guān)鍵字調(diào)用。
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
=>
是箭頭函數(shù),是ES6標(biāo)準(zhǔn)中新增的一種新的函數(shù)。顧名思義,箭頭函數(shù)是一種使用箭頭(=>)定義函數(shù)的新語法,箭頭函數(shù)表達(dá)式的語法比函數(shù)表達(dá)式更簡潔,但是它與傳統(tǒng)的JavaScript函數(shù)有些許不同,主要集中在以下方面:
-
沒有this、super、arguments和new.target綁定,其值由外圍最近一層非箭頭函數(shù)決定
-
不能通過new關(guān)鍵字調(diào)用
-
沒有原型
-
不可以改變this的綁定
-
不支持arguments對象
-
不支持重復(fù)的命名參數(shù)
-
函數(shù)體內(nèi)的this的指向始終是指向定義它所在的對象,而不會(huì)指向調(diào)用它的對象,我們知道es5中的函數(shù)是誰執(zhí)行它,它就指向誰。
基礎(chǔ)語法
(param1, param2, …, paramN) => { statements } (param1, param2, …, paramN) => expression //相當(dāng)于:(param1, param2, …, paramN) =>{ return expression; } // 當(dāng)只有一個(gè)參數(shù)時(shí),圓括號(hào)是可選的: (singleParam) => { statements } singleParam => {statements } // 沒有參數(shù)的函數(shù)應(yīng)該寫成一對圓括號(hào): () => { statements }
簡單示例
x => x * x
即相當(dāng)于:
function (x) { return x * x; }
更短的函數(shù)示例
var elements = [ 'Hydrogen', 'Helium', 'Lithium', 'Beryllium' ]; elements.map(function(element) { return element.length; }); // 返回?cái)?shù)組:[8, 6, 7, 9] // 上面的普通函數(shù)可以改寫成如下的箭頭函數(shù) elements.map((element) => { return element.length; }); // [8, 6, 7, 9] // 當(dāng)箭頭函數(shù)只有一個(gè)參數(shù)時(shí),可以省略參數(shù)的圓括號(hào) elements.map(element => { return element.length; }); // [8, 6, 7, 9] // 當(dāng)箭頭函數(shù)的函數(shù)體只有一個(gè) `return` 語句時(shí),可以省略 `return` 關(guān)鍵字和方法體的花括號(hào) elements.map(element => element.length); // [8, 6, 7, 9] // 在這個(gè)例子中,因?yàn)槲覀冎恍枰?`length` 屬性,所以可以使用參數(shù)解構(gòu) // 需要注意的是字符串 `"length"` 是我們想要獲得的屬性的名稱,而 `lengthFooBArX` 則只是個(gè)變量名, // 可以替換成任意合法的變量名 elements.map(({ "length": lengthFooBArX }) => lengthFooBArX); // [8, 6, 7, 9]
三元運(yùn)算符示例
箭頭函數(shù)也可以使用條件(三元)運(yùn)算符:
var simple = a => a > 15 ? 15 : a; simple(16); // 15 simple(10); // 10 let max = (a, b) => a > b ? a : b;
不與new一起使用
箭頭函數(shù)不能用作構(gòu)造器,和 new一起用會(huì)拋出錯(cuò)誤。
var Foo = () => {}; var foo = new Foo(); // TypeError: Foo is not a constructor
沒有prototype屬性
箭頭函數(shù)沒有prototype屬性。
var Foo = () => {}; console.log(Foo.prototype); // undefined
函數(shù)體
箭頭函數(shù)可以有一個(gè)“簡寫體”或常見的“塊體”。
在一個(gè)簡寫體中,只需要一個(gè)表達(dá)式,并附加一個(gè)隱式的返回值。在塊體中,必須使用明確的return
語句。
var func = x => x * x; // 簡寫函數(shù) 省略return(簡寫體) var func = (x, y) => { return x + y; }; //常規(guī)編寫 明確的返回值(塊體)
箭頭函數(shù)遞歸
var fact = (x) => ( x==0 ? 1 : x*fact(x-1) ); fact(5); // 120
瀏覽器兼容性
【