亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解JavaScript中的箭頭函數(shù)

 更新時(shí)間:2015年07月28日 11:38:14   作者:Jason Orendorff  
這篇文章主要介紹了深入理解JavaScript中的箭頭函數(shù),文中主要針對(duì)ES6版本的JS進(jìn)行相關(guān)的講解,需要的朋友可以參考下

從一開(kāi)始箭頭就是 JavaScript 的一部分,在第一個(gè) JavaScript 中就建議將內(nèi)聯(lián)的腳本代碼包裹在 HTML 的注釋中,這可以防止那些不支持 JavaScript 的瀏覽器錯(cuò)誤滴將你的代碼顯示為明文。你也許寫(xiě)過(guò)下面這樣的代碼:

<script language="javascript">
<!--
  document.bgColor = "brown"; // red
// -->
</script>
 
<script language="javascript">
<!--
  document.bgColor = "brown"; // red
// -->
</script>

古老的瀏覽器將看到兩個(gè)不被支持的標(biāo)簽和一段注釋?zhuān)挥兄С?JavaScript 的新瀏覽器才會(huì)將其解析為 JavaScript 代碼。

為了支持這個(gè)古怪的特性,瀏覽器的 JavaScript 引擎把 <!-- 作為一個(gè)單行注釋的開(kāi)始,這不是開(kāi)玩笑的,這一直都是這門(mén)語(yǔ)言的一部分,并且至今還能用,不僅僅在 <script> 標(biāo)簽內(nèi)的首行,而是在 JavaScript 代碼的任何部位都可用,它甚至還能在 Node 中使用。

湊巧的是,這種風(fēng)格的注釋在 ES6 中首次被標(biāo)準(zhǔn)化。但這并不是我們將談?wù)摰募^。

--> 也表示一個(gè)單行注釋?zhuān)c HTML 不同的是,在 HTML 中,--> 之前的部分是注釋內(nèi)容,而在 JavaScript 中,在 --> 之后的行才是注釋。

只有當(dāng) --> 出現(xiàn)在一行的開(kāi)始時(shí),才表示該箭頭是一個(gè)注釋?zhuān)驗(yàn)樵谄渌闆r下,--> 是一個(gè)操作符(goes to)。

function countdown(n) {
 while (n-->0) // "n goes to zero"
  alert(n);
 blastoff();
}
 
function countdown(n) {
 while (n-->0) // "n goes to zero"
  alert(n);
 blastoff();
}

上面代碼是真實(shí)能運(yùn)行的。循環(huán)運(yùn)行直到 n 為 0,這并不是 ES6 的新特性,但結(jié)合我們熟悉的特性,這具有很強(qiáng)的誤導(dǎo)性。你能搞明白上面代碼的運(yùn)行情況嗎?你可以在 Stack Overflow 上找到相應(yīng)的解答。

當(dāng)然還有一個(gè)箭頭,那就是小于等于操作符 <=,也許你還可以找到使用箭頭的地方,但我們還是停下來(lái),看一個(gè)我們從沒(méi)見(jiàn)過(guò)的箭頭:

  •     <!-- 單行注釋
  •     --> goes to 操作符
  •     <= 小于等于操作符
  •     => ???

那么,=> 表示什么呢?這就是本文將討論的話題。

首先,我們來(lái)談?wù)労瘮?shù)。
無(wú)處不在的函數(shù)表達(dá)式

JavaScript 一個(gè)有趣的特點(diǎn)是,任何時(shí)候你需要一個(gè)函數(shù),你可以很方便地創(chuàng)建它們。

例如,為一個(gè)按鈕綁定點(diǎn)擊事件:

$("#confetti-btn").click(
 
$("#confetti-btn").click(

jQuery 的 .click() 方法需要一個(gè)函數(shù)作為參數(shù),我們可以很方便地就地創(chuàng)建一個(gè)函數(shù):

$("#confetti-btn").click(function (event) {
 playTrumpet();
 fireConfettiCannon();
});

 
$("#confetti-btn").click(function (event) {
 playTrumpet();
 fireConfettiCannon();
});

現(xiàn)在對(duì)我們來(lái)說(shuō),編寫(xiě)這樣的代碼是最自然的事了。但是在 JavaScript 流行起來(lái)之前,這種風(fēng)格的代碼看起來(lái)還是有些奇怪,因?yàn)樵谄渌Z(yǔ)言中都沒(méi)有這樣的特性。在 1958 年,Lisp 就有了函數(shù)表達(dá)式,也叫 lambda 函數(shù),而在存在多年的 C++、Python、C# 和 Java 中沒(méi)有該特性。

現(xiàn)在,這四門(mén)語(yǔ)言都有了 lambda 表達(dá)式,而且新出現(xiàn)的語(yǔ)言都普遍內(nèi)置了 lambda 表達(dá)式。如今 JavaScript 也支持該特性了,這必須感謝那些重度依賴(lài) lambda 表達(dá)式的庫(kù)的開(kāi)發(fā)者,這推動(dòng)了該特性被廣泛采納。

與其他幾門(mén)語(yǔ)言相比,JavaScript 的語(yǔ)法略顯冗長(zhǎng):

// A very simple function in six languages.
function (a) { return a > 0; } // JS
[](int a) { return a > 0; } // C++
(lambda (a) (> a 0)) ;; Lisp
lambda a: a > 0 # Python
a => a > 0 // C#
a -> a > 0 // Java
 
// A very simple function in six languages.
function (a) { return a > 0; } // JS
[](int a) { return a > 0; } // C++
(lambda (a) (> a 0)) ;; Lisp
lambda a: a > 0 # Python
a => a > 0 // C#
a -> a > 0 // Java

箭頭函數(shù)

ES6 引入了一種新的語(yǔ)法來(lái)編寫(xiě)函數(shù):

// ES5
var selected = allJobs.filter(function (job) {
 return job.isSelected();
});

// ES6
var selected = allJobs.filter(job => job.isSelected());

 
// ES5
var selected = allJobs.filter(function (job) {
 return job.isSelected();
});
 
// ES6
var selected = allJobs.filter(job => job.isSelected());

當(dāng)你需要只有一個(gè)參數(shù)的函數(shù),箭頭函數(shù)的語(yǔ)法可以簡(jiǎn)化為 Identifier => Expression,直接省略了 function 和 return 關(guān)鍵字,連括號(hào)和結(jié)尾的分號(hào)也同時(shí)省略了。

編寫(xiě)一個(gè)有多個(gè)(或沒(méi)有參數(shù),或 Rest 參數(shù)和參數(shù)默認(rèn)值,或解構(gòu)參數(shù))參數(shù)的函數(shù),你需要用括號(hào)將參數(shù)括起來(lái):

// ES5
var total = values.reduce(function (a, b) {
 return a + b;
}, 0);

// ES6
var total = values.reduce((a, b) => a + b, 0);
 
// ES5
var total = values.reduce(function (a, b) {
 return a + b;
}, 0);
 
// ES6
var total = values.reduce((a, b) => a + b, 0);

箭頭函數(shù)還可以與一些工具函數(shù)庫(kù)完美地配合使用,比如 Underscore.js 和 Immutable,事實(shí)上,Immutable 文檔中的例子全部都是使用 ES6 編寫(xiě),其中有很多已經(jīng)使用到了箭頭函數(shù)。

函數(shù)體除了使用一個(gè)表達(dá)式外,箭頭函數(shù)還可以包含一個(gè)語(yǔ)句塊,回憶之前我們提到過(guò)的例子:

// ES5
$("#confetti-btn").click(function (event) {
 playTrumpet();
 fireConfettiCannon();
});
 
// ES5
$("#confetti-btn").click(function (event) {
 playTrumpet();
 fireConfettiCannon();
});

下面是采用箭頭函數(shù)的寫(xiě)法:

// ES6
$("#confetti-btn").click(event => {
 playTrumpet();
 fireConfettiCannon();
});
 
// ES6
$("#confetti-btn").click(event => {
 playTrumpet();
 fireConfettiCannon();
});

需要注意的是,使用語(yǔ)句塊的箭頭函數(shù)不會(huì)自動(dòng)返回一個(gè)值,必須顯式地使用 return 來(lái)返回一個(gè)值。

還有一個(gè)忠告,當(dāng)使用箭頭函數(shù)來(lái)返回一個(gè)對(duì)象時(shí),始終使用括號(hào)將返回的對(duì)象括起來(lái):

// create a new empty object for each puppy to play with
var chewToys = puppies.map(puppy => {});  // BUG!
var chewToys = puppies.map(puppy => ({})); // ok

 
// create a new empty object for each puppy to play with
var chewToys = puppies.map(puppy => {});  // BUG!
var chewToys = puppies.map(puppy => ({})); // ok

因?yàn)榭諏?duì)象 {} 與空語(yǔ)句塊 {} 看上去一模一樣,ES6 將始終把緊跟在 => 后面的 { 當(dāng)作語(yǔ)句塊的開(kāi)始,而不是一個(gè)對(duì)象的開(kāi)始,那么 puppy => {} 就被解析為一個(gè)沒(méi)有函數(shù)體的箭頭函數(shù),而且返回值為 undefined。

相關(guān)文章

  • 深入理解javascript的執(zhí)行順序

    深入理解javascript的執(zhí)行順序

    JavaScript是一種描述型腳本語(yǔ)言,它不同于java或C#等編譯性語(yǔ)言,它不需要進(jìn)行編譯成中間語(yǔ)言,而是由瀏覽器進(jìn)行動(dòng)態(tài)地解析與執(zhí)行
    2014-04-04
  • js正則相關(guān)知識(shí)點(diǎn)專(zhuān)題

    js正則相關(guān)知識(shí)點(diǎn)專(zhuān)題

    本篇內(nèi)容是小編整理的關(guān)于腳本之家精選的JS正則的優(yōu)秀文章,適合大家學(xué)習(xí)JS正則的相關(guān)內(nèi)容,有需要的朋友參考下。
    2018-05-05
  • javascript編程起步(第四課)

    javascript編程起步(第四課)

    javascript編程起步(第四課)...
    2007-01-01
  • Knockout text綁定DOM的使用方法

    Knockout text綁定DOM的使用方法

    本文講解Knockout text綁定到DOM元素上,使得該元素顯示的文本值為你綁定的參數(shù)。該綁定在顯示<span>或者<em>上非常有用,可以用在任何元素上
    2013-11-11
  • JavaScript中變量的用法

    JavaScript中變量的用法

    這篇文章介紹了JavaScript中變量的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 淺析JavaScript中的對(duì)象類(lèi)型Object

    淺析JavaScript中的對(duì)象類(lèi)型Object

    盡管JavaScript的擁躉一再?gòu)?qiáng)調(diào)js的面相對(duì)象,然而,或許只有在名為Object的這一類(lèi)型中才能勉強(qiáng)理解出-- well...下面就讓我們一起來(lái)淺析JavaScript中的對(duì)象類(lèi)型Object
    2016-05-05
  • Three.js源碼閱讀筆記(基礎(chǔ)的核心Core對(duì)象)

    Three.js源碼閱讀筆記(基礎(chǔ)的核心Core對(duì)象)

    Three.js是一個(gè)比較偉大的webgl開(kāi)源庫(kù),它簡(jiǎn)化了瀏覽器3D編程,使得使用JavaScript在瀏覽器中創(chuàng)建復(fù)雜的場(chǎng)景變得容易很多接下來(lái)先從最基礎(chǔ)的核心(Core)對(duì)象開(kāi)始,感興趣的朋友可以參考下
    2012-12-12
  • 詳解JS瀏覽器儲(chǔ)存

    詳解JS瀏覽器儲(chǔ)存

    這篇文章主要介紹了JS瀏覽器儲(chǔ)存,對(duì)存儲(chǔ)數(shù)據(jù)感興趣的同學(xué),可以參考下
    2021-05-05
  • THREE.JS入門(mén)教程(5)你應(yīng)當(dāng)知道的十件事

    THREE.JS入門(mén)教程(5)你應(yīng)當(dāng)知道的十件事

    Three.js是一個(gè)偉大的開(kāi)源WebGL庫(kù),WebGL允許JavaScript操作GPU,在瀏覽器端實(shí)現(xiàn)真正意義的3D,本文會(huì)讓你了解一下使用THREE.JS處理3D/避免SetInterval/使用倒序循環(huán)等等,感興趣的朋友可以了解下哦
    2013-01-01
  • javascript異步編程的4種方法

    javascript異步編程的4種方法

    本文總結(jié)了"異步模式"編程的4種方法,理解它們可以讓你寫(xiě)出結(jié)構(gòu)更合理、性能更出色、維護(hù)更方便的Javascript程序
    2014-02-02

最新評(píng)論