<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 深入理解JavaScript中的箭頭函數

    時間:2024-05-20 23:49:43 JavaScript 我要投稿
    • 相關推薦

    關于深入理解JavaScript中的箭頭函數

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

      古老的瀏覽器將看到兩個不被支持的標簽和一段注釋,只有支持 JavaScript 的新瀏覽器才會將其解析為 JavaScript 代碼。

      為了支持這個古怪的特性,瀏覽器的 JavaScript 引擎把  也表示一個單行注釋,與 HTML 不同的是,在 HTML 中,--> 之前的部分是注釋內容,而在 JavaScript 中,在 --> 之后的行才是注釋。

      只有當 --> 出現在一行的開始時,才表示該箭頭是一個注釋,因為在其他情況下,--> 是一個操作符(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();}

      上面代碼是真實能運行的。循環運行直到 n 為 0,這并不是 ES6 的新特性,但結合我們熟悉的特性,這具有很強的誤導性。你能搞明白上面代碼的運行情況嗎?你可以在 Stack Overflow 上找到相應的解答。

      當然還有一個箭頭,那就是小于等于操作符 <=,也許你還可以找到使用箭頭的地方,但我們還是停下來,看一個我們從沒見過的箭頭:

       goes to 操作符 <=> ???

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

      首先,我們來談談函數。

      無處不在的函數表達式

      JavaScript 一個有趣的特點是,任何時候你需要一個函數,你可以很方便地創建它們。

      例如,為一個按鈕綁定點擊事件:

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

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

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

      現在對我們來說,編寫這樣的代碼是最自然的事了。但是在 JavaScript 流行起來之前,這種風格的代碼看起來還是有些奇怪,因為在其他語言中都沒有這樣的特性。在 1958 年,Lisp 就有了函數表達式,也叫 lambda 函數,而在存在多年的 C++、Python、C# 和 Java 中沒有該特性。

      現在,這四門語言都有了 lambda 表達式,而且新出現的語言都普遍內置了 lambda 表達式。如今 JavaScript 也支持該特性了,這必須感謝那些重度依賴 lambda 表達式的庫的開發者,這推動了該特性被廣泛采納。

      與其他幾門語言相比,JavaScript 的語法略顯冗長:

      // A very simple function in six languages.function (a) { return a > 0; } // JS[](int a) { return a > 0; } // C++(lambda (a) (> a 0)) ;; Lisplambda a: a > 0 # Pythona => 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)) ;; Lisplambda a: a > 0 # Pythona => a > 0 // C#a -> a > 0 // Java

      箭頭函數

      ES6 引入了一種新的語法來編寫函數:

      // ES5var selected = allJobs.filter(function (job) { return job.isSelected();});// ES6var selected = allJobs.filter(job => job.isSelected()); // ES5var selected = allJobs.filter(function (job) { return job.isSelected();}); // ES6var selected = allJobs.filter(job => job.isSelected());

      當你需要只有一個參數的函數,箭頭函數的語法可以簡化為 Identifier => Expression,直接省略了 function 和 return 關鍵字,連括號和結尾的分號也同時省略了。

      編寫一個有多個(或沒有參數,或 Rest 參數和參數默認值,或解構參數)參數的函數,你需要用括號將參數括起來:

      // ES5var total = values.reduce(function (a, b) { return a + b;}, 0);// ES6var total = values.reduce((a, b) => a + b, 0); // ES5var total = values.reduce(function (a, b) { return a + b;}, 0); // ES6var total = values.reduce((a, b) => a + b, 0);

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

      函數體除了使用一個表達式外,箭頭函數還可以包含一個語句塊,回憶之前我們提到過的例子:

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

      下面是采用箭頭函數的寫法:

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

      需要注意的是,使用語句塊的箭頭函數不會自動返回一個值,必須顯式地使用 return 來返回一個值。

      還有一個忠告,當使用箭頭函數來返回一個對象時,始終使用括號將返回的對象括起來:

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

      因為空對象 {} 與空語句塊 {} 看上去一模一樣,ES6 將始終把緊跟在 => 后面的 { 當作語句塊的開始,而不是一個對象的開始,那么 puppy => {} 就被解析為一個沒有函數體的箭頭函數,而且返回值為 undefined。

    【深入理解JavaScript中的箭頭函數】相關文章:

    有關深入理解JavaScript中的并行處理的介紹10-14

    JavaScript中push(),join() 函數實例詳解09-05

    對javascript的理解08-08

    javascript面向對象中的對象怎么理解09-02

    淺談javascript中的單線程理解08-16

    淺析jQuery 遍歷函數javascript08-06

    淺談如何深入學習Javascript中的this關鍵字08-19

    Javascript函數的定義和用法分析08-15

    理解JavaScript原型鏈教程09-02

    最常用的20個javascript方法函數09-10

    主站蜘蛛池模板: 精品亚洲成a人片在线观看少妇| 久热这里只有精品12| 亚洲精品无码专区久久久 | 97久久精品人妻人人搡人人玩| 久草热8精品视频在线观看| 欧美精品一本久久男人的天堂| 国产精品无码无在线观看| 亚洲七七久久精品中文国产| 国产精品福利电影一区二区三区四区欧美白嫩精品 | 在线成人精品国产区免费| 国产免费久久精品99久久| 精品免费视在线观看| 国产国拍亚洲精品mv在线观看| 亚洲精品乱码久久久久久按摩| 久热这里只有精品99国产6| 国产精品igao视频| 热re99久久精品国产99热| 国产91大片精品一区在线观看| 日韩精品区一区二区三VR| 久久久久久极精品久久久| 精品国产污污免费网站入口在线| 国产L精品国产亚洲区久久| 久久精品草草草| AV无码精品一区二区三区| 国产亚洲精品无码成人| 国内精品久久久久影院优| 无码精品人妻一区二区三区漫画| 正在播放酒店精品少妇约| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲欧美日韩精品| 国产精品亚洲专区在线观看| 国产69精品久久久久777| 精品乱人伦一区二区三区| 久久久久免费精品国产| 午夜影视日本亚洲欧洲精品一区| 欧美精品免费线视频观看视频| 欧美国产日韩精品| 99精品久久久久久久婷婷| 国产精品成人国产乱一区| 国产精品无码永久免费888| 精品精品国产高清a毛片|