深入理解JavaScript 箭頭函數(shù)
JavaScript箭頭函數(shù)是ECMAScript 6中引入的編寫(xiě)函數(shù)表達(dá)式的一種簡(jiǎn)便方法。通常,在JavaScript中,可以通過(guò)兩種方式創(chuàng)建函數(shù):
- 函數(shù)語(yǔ)句。
- 函數(shù)表達(dá)式。
可以如下所示創(chuàng)建函數(shù)語(yǔ)句:
function add(num1, num2) { var res = num1 + num2; return res; } var sum = add(7, 2); console.log(sum);
也可以創(chuàng)建相同功能的函數(shù)表達(dá)式,如下所示:
var add = function (num1, num2) { var res = num1 + num2; return res; } var sum = add(7, 2); console.log(sum);
ECMA 2015(或ECMA Script 6)引入了更短的語(yǔ)法來(lái)編寫(xiě)函數(shù)表達(dá)式,稱為箭頭函數(shù)。使用箭頭函數(shù),你可以將上面的函數(shù)表達(dá)式編寫(xiě)為:
var add = (num1, num2) => { return num1 + num2; };
正如你所看到的,使用箭頭函數(shù)編寫(xiě)的函數(shù)表達(dá)式更短。
箭頭函數(shù)的基本語(yǔ)法規(guī)則
首先,參數(shù)應(yīng)該在小括號(hào)中傳遞。你可以創(chuàng)建有兩個(gè)參數(shù)的箭頭函數(shù),如下所示:
ar add = (num1, num2) => { return num1 + num2; };
如果只要傳遞一個(gè)參數(shù),那么括號(hào)是可選的,可以選擇忽略。你可以創(chuàng)建一個(gè)參數(shù)的箭頭函數(shù),如下所示:
var add = num => { return num * 10; };
如果沒(méi)有參數(shù),那么你必須要有一個(gè)空括號(hào)——不能沒(méi)有。所以對(duì)于沒(méi)有參數(shù)的函數(shù),箭頭函數(shù)是這樣寫(xiě)的:
var add = () => { console.log("hey foo") };
如果函數(shù)中有單個(gè)表達(dá)式或語(yǔ)句:
- 在主體中使用括號(hào)是可選的。
- 使用return語(yǔ)句是可選的。
你可以重寫(xiě)add函數(shù),而不使用函數(shù)體中的括號(hào)和return語(yǔ)句,如下所示:
var add = (num1, num2) => num1 + num2;
你也可以使用控制臺(tái)語(yǔ)句編寫(xiě)不帶參數(shù)的函數(shù),如下所示:
var add = () => console.log("hey");
返回對(duì)象字面量
JavaScript箭頭函數(shù)也可以返回對(duì)象字面量。唯一的要求是你需要把返回對(duì)象裝入小括號(hào)中,如下所示:
var foo = (name, age) => ({ name: name, age: age }) var r = foo("my cat", 22); console.log(r);
正如你所看到的那樣,要返回的對(duì)象被放在了小括號(hào)內(nèi)。如果你不這樣做,那么JavaScript將無(wú)法區(qū)分對(duì)象字面量和函數(shù)體。
箭頭函數(shù)支持rest參數(shù)
JavaScript箭頭函數(shù)支持另一個(gè)ES6功能:rest參數(shù)。你可以在箭頭函數(shù)中使用rest參數(shù),如下面的代碼所示:
var add = (num1, num2, ...restparam) => { console.log(restparam.length); var result = num1 + num2; return result; } var r = add(67, 8, 90, 23); console.log(r);
在這個(gè)例子中,當(dāng)你使用帶有rest參數(shù)的箭頭函數(shù)時(shí),輸出會(huì)是2和75,因?yàn)閭鬟f的額外參數(shù)的數(shù)量是2,num1和num2的總和是75。
箭頭功能支持默認(rèn)參數(shù)
另外,JavaScript箭頭函數(shù)還支持另一個(gè)ES6功能:默認(rèn)參數(shù)。此處詳細(xì)介紹了默認(rèn)參數(shù)。你可以在箭頭函數(shù)中使用默認(rèn)參數(shù),如下所示:
var add = (num1 = 9, num2 = 8) => { var result = num1 + num2; return result; } var r = add(); console.log(r);
在上面的代碼中,箭頭函數(shù)中有默認(rèn)參數(shù)。調(diào)用該函數(shù)時(shí),我們沒(méi)有傳遞任何值,并且由于默認(rèn)參數(shù)的存在,輸出將是17。
“this”在箭頭函數(shù)中如何工作?
箭頭函數(shù)沒(méi)有它自己的this值。箭頭函數(shù)中的this值總是從封閉范圍繼承。在JavaScript中,每個(gè)函數(shù)都有它自己的this值,這取決于代碼是如何調(diào)用函數(shù)的。請(qǐng)仔細(xì)看下面列出的代碼:
var Cat = { name: 'mew', canRun: function () { console.log(this) var foo = () => { console.log(this) } foo(); } };
在這里,cat是一個(gè)對(duì)象字面量,它包括:
- 屬性名稱。
- 方法canRun。
在canRun方法中,我們創(chuàng)建了一個(gè)箭頭函數(shù)foo,給出了this值。由于箭頭函數(shù)沒(méi)有它自己的this值,所以它將從周?chē)暮瘮?shù)獲取,因此,你將得到:
正如你所看到的,this值在canRun方法和箭頭函數(shù)foo中是相同的。箭頭函數(shù)從繼承范圍得到this值。如果你對(duì)此不甚清楚,那么請(qǐng)牢記以下兩條規(guī)則:
- 使用object.method在方法中獲取一個(gè)有意義的對(duì)象作為this值。
- 對(duì)于任何其他要求,使用箭頭函數(shù),由于函數(shù)沒(méi)有自己的this值,所以它將繼承封閉范圍的this值。
使用箭頭函數(shù)的限制條件
應(yīng)用箭頭函數(shù)時(shí)要注意的一些限制條件:
- 箭頭函數(shù)沒(méi)有參數(shù)對(duì)象。
- 箭頭函數(shù)不能與新運(yùn)算符一起使用,因此它不能用作構(gòu)造函數(shù)。
- 箭頭函數(shù)沒(méi)有原型屬性。
如果你嘗試使用箭頭函數(shù)作為構(gòu)造函數(shù),那么你會(huì)得到異常。請(qǐng)看下面的代碼:
var foo = (name, age) => { name = name, age = age }; var f1 = new foo("cat", 6);
代碼試圖通過(guò)使用箭頭函數(shù)foo作為構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象f1,JavaScript將拋出以下異常:
而且,當(dāng)你試圖輸出箭頭函數(shù)的原型值時(shí),你會(huì)得到undefined的輸出:
var foo = (name, age) => { name = name, age = age }; console.log(foo.prototype);
發(fā)生這種情況的原因是因?yàn)榧^函數(shù)沒(méi)有原型屬性。請(qǐng)記住:雖然箭頭函數(shù)為你提供了編寫(xiě)函數(shù)表達(dá)式的簡(jiǎn)短方法,但它沒(méi)有自己的this值,也不能用作構(gòu)造函數(shù)。
英文原文:Easy JavaScript Part 6 : Arrow functions in JavaScript
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript類型系統(tǒng)——undefined和null全面了解
下面小編就為大家?guī)?lái)一篇javascript類型系統(tǒng)——undefined和null全面了解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07推薦JavaScript實(shí)現(xiàn)繼承的最佳方式
本文是介紹了實(shí)用call方法結(jié)合原型鏈方法來(lái)實(shí)現(xiàn)javascript繼承的最佳方式,非常的實(shí)用,有需要的小伙伴可以參考下2014-11-11JavaScript 詳解緩動(dòng)動(dòng)畫(huà)的封裝與使用
緩動(dòng)動(dòng)畫(huà)原理:移動(dòng)的像素慢慢減少,讓效果看起來(lái)更柔和更美觀,通過(guò)定時(shí)器加回調(diào)函數(shù),實(shí)現(xiàn)動(dòng)畫(huà)效果以及更多具體功能,非常好用2021-11-11用JavaScript實(shí)現(xiàn)頁(yè)面重定向功能的教程
這篇文章主要介紹了用JavaScript實(shí)現(xiàn)頁(yè)面重定向功能的教程,是JS入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06