摘要:譯者按箭頭函數看上去只是語法的變動,其實也影響了的作用域。打開瀏覽器開發者控制臺,輸入我們將變量綁定到一個箭頭函數,該函數有一個參數返回。或者說箭頭函數不會改變本來的綁定。最后,結束刷屏的打印總結箭頭函數寫代碼擁有更加簡潔的語法不會綁定。
譯者按: 箭頭函數看上去只是語法的變動,其實也影響了this的作用域。
原文: JavaScript: Arrow Functions for Beginners
譯者: Fundebug
本文采用意譯,版權歸原作者所有
本文我們介紹箭頭(arrow)函數的優點。
更簡潔的語法我們先來按常規語法定義函數:
function funcName(params) { return params + 2; } funcName(2); // 4
該函數使用箭頭函數可以使用僅僅一行代碼搞定!
var funcName = params => params + 2; funcName(2); // 4
是不是很酷!雖然是一個極端簡潔的例子,但是很好的表述了箭頭函數在寫代碼時的優勢。我們來深入了解箭頭函數的語法:
parameters => { statements; };
如果沒有參數,那么可以進一步簡化:
() => { statements; };
如果只有一個參數,可以省略括號:
parameters => { statements; };
如果返回值僅僅只有一個表達式(expression), 還可以省略大括號:
parameters => expression // 等價于: function (parameters){ return expression; }
現在你已經學會了箭頭函數的語法,我們來實戰一下。打開 Chrome 瀏覽器開發者控制臺,輸入:
var double = num => num * 2;
我們將變量double綁定到一個箭頭函數,該函數有一個參數num, 返回 num * 2。 調用該函數:
double(2); // 4 double(3); // 6
一行代碼搞定 BUG 監控:Fundebug
沒有局部this的綁定和一般的函數不同,箭頭函數不會綁定this。 或者說箭頭函數不會改變this本來的綁定。
我們用一個例子來說明:
function Counter() { this.num = 0; } var a = new Counter();
因為使用了關鍵字new構造,Counter()函數中的this綁定到一個新的對象,并且賦值給a。通過console.log打印a.num,會輸出 0。
console.log(a.num); // 0
如果我們想每過一秒將a.num的值加 1,該如何實現呢?可以使用setInterval()函數。
function Counter() { this.num = 0; this.timer = setInterval(function add() { this.num++; console.log(this.num); }, 1000); }
我們來看一下輸出結果:
var b = new Counter(); // NaN // NaN // NaN // ...
你會發現,每隔一秒都會有一個NaN打印出來,而不是累加的數字。到底哪里錯了呢?
首先使用如下語句停止setInterval函數的連續執行:
clearInterval(b.timer);
我們來嘗試理解為什么出錯:根據上一篇博客講解的規則,首先函數setInterval沒有被某個聲明的對象調用,也沒有使用new關鍵字,再之沒有使用bind, call和apply。setInterval只是一個普通的函數。實際上setInterval里面的this綁定到全局對象的。我們可以通過將this打印出來驗證這一點:
function Counter() { this.num = 0; this.timer = setInterval(function add() { console.log(this); }, 1000); } var b = new Counter();
你會發現,整個window對象被打印出來。 使用如下命令停止打印:
clearInterval(b.timer);
回到之前的函數,之所以打印NaN,是因為this.num綁定到window對象的num,而window.num未定義。
那么,我們如何解決這個問題呢?使用箭頭函數!使用箭頭函數就不會導致this被綁定到全局對象。
function Counter() { this.num = 0; this.timer = setInterval(() => { this.num++; console.log(this.num); }, 1000); } var b = new Counter(); // 1 // 2 // 3 // ...
通過Counter構造函數綁定的this將會被保留。在setInterval函數中,this依然指向我們新創建的b對象。
為了驗證剛剛的說法,我們可以將 Counter函數中的this綁定到that, 然后在setInterval中判斷this和that是否相同。
function Counter() { var that = this; this.timer = setInterval(() => { console.log(this === that); }, 1000); } var b = new Counter(); // true // true // ...
正如我們期望的,打印值每次都是true。最后,結束刷屏的打印:
clearInterval(b.timer);總結
箭頭函數寫代碼擁有更加簡潔的語法;
不會綁定this。
關于FundebugFundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了10億+錯誤事件,付費客戶有Google、360、金山軟件、百姓網等眾多品牌企業。歡迎大家免費試用!
版權聲明轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/05/25/arrow-function-for-beginner/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83318.html
摘要:因為關鍵字沒有處于一個聲明的對象內部,默認指向全局對象。這一點可能對于大部分初學者來說有點難以理解。函數會返回一個函數,并且將綁定好。自從年雙十一正式上線,累計處理了億錯誤事件,得到了金山軟件百姓網等眾多知名用戶的認可。 譯者按: JavaScript的this和Java等面向對象語言中的this大不一樣,bind()、call()和apply()函數更是將this的靈活度進一步延伸。...
摘要:然而,不會在年的基礎上加,而只是表示年。閉包這是一個經典的面試題雖然期望輸出,然而實際上卻不會。因為第行的沒有在正確的環境下執行。 譯者按: 漫漫編程路,總有一些坑讓你淚流滿面。 原文: Who said javascript was easy ? 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。 這里我們針對JavaScri...
摘要:數組的方法方法創建一個新的數組,新數組中的元素是通過檢查指定數組中符合條件的所有元素。可選,執行函數時的值。刪除所有的鍵值對,沒有返回值。返回一個布爾值,表示某個鍵是否在當前對象之中。 說明 JavaScript數組去重這個問題,經常出現在面試題中,以前也寫過一篇數組去重的文章,(JavaScript 數組去重的多種方法原理詳解)但感覺代碼還是有點不夠簡單,今天和大家再說兩種方法,代碼...
摘要:數組的方法方法創建一個新的數組,新數組中的元素是通過檢查指定數組中符合條件的所有元素。可選,執行函數時的值。刪除所有的鍵值對,沒有返回值。返回一個布爾值,表示某個鍵是否在當前對象之中。 說明 JavaScript數組去重這個問題,經常出現在面試題中,以前也寫過一篇數組去重的文章,(JavaScript 數組去重的多種方法原理詳解)但感覺代碼還是有點不夠簡單,今天和大家再說兩種方法,代碼...
閱讀 1228·2021-09-26 09:46
閱讀 1582·2021-09-06 15:00
閱讀 713·2019-08-30 15:52
閱讀 1116·2019-08-29 13:10
閱讀 1277·2019-08-26 13:47
閱讀 1479·2019-08-26 13:35
閱讀 2028·2019-08-23 18:38
閱讀 721·2019-08-23 17:59