我們在學習es6的時候會遇到一個神奇的語法 一個括弧和一個箭頭就可以實現一個函數,有時遇到參數時只傳參數就行甚至都不用寫括弧,看似簡單其實跟我們在es5中的函數是一樣的有時會改變我們this的指向。下麵我們來看一下箭頭函數我們先來按常規語法定義函數: 該函數使用箭頭函數可以使用僅僅一行代碼搞定! 是 ...
我們在學習es6的時候會遇到一個神奇的語法 一個括弧和一個箭頭就可以實現一個函數,有時遇到參數時只傳參數就行甚至都不用寫括弧,看似簡單其實跟我們在es5中的函數是一樣的有時會改變我們this的指向。下麵我們來看一下箭頭函數我們先來按常規語法定義函數:
function funcName(params) {
|
該函數使用箭頭函數可以使用僅僅一行代碼搞定!
var funcName = (params) => params + 2
|
是不是很酷!雖然是一個極端簡潔的例子,但是很好的表述了箭頭函數在寫代碼時的優勢。我們來深入瞭解箭頭函數的語法:
(parameters) => { statements }
|
如果沒有參數,那麼可以進一步簡化:
() => { statements }
|
如果只有一個參數,可以省略括弧:
parameters => { statements }
|
如果返回值僅僅只有一個表達式(expression), 還可以省略大括弧:
parameters => expression
|
現在你已經學會了箭頭函數的語法,我們來實戰一下。打開Chrome瀏覽器開發者控制台,輸入:
var double = num => num * 2
|
我們將變數double
綁定到一個箭頭函數,該函數有一個參數num
, 返回 num * 2
。 調用該函數:
double(2);
|
沒有局部this
的綁定
和一般的函數不同,箭頭函數不會綁定this
。 或則說箭頭函數不會改變this
本來的綁定。
我們用一個例子來說明:
function Counter() {
|
因為使用了關鍵字new
構造,Count()函數中的this
綁定到一個新的對象,並且賦值給a
。通過console.log
列印a.num
,會輸出0。
console.log(a.num);
|
如果我們想每過一秒將a.num
的值加1,該如何實現呢?可以使用setInterval()
函數。
function Counter() {
|
我們來看一下輸出結果:
var b = new Counter();
|
你會發現,每隔一秒都會有一個NaN
列印出來,而不是累加的數字。到底哪裡錯了呢?
首先使用如下語句停止setInterval
函數的連續執行:
clearInterval(b.timer);
|
我們來嘗試理解為什麼出錯:根據上一篇博客講解的規則,首先函數setInterval
沒有被某個聲明的對象調用,也沒有使用new
關鍵字,再之沒有使用bind
, call
和apply
。setInterval
只是一個普通的函數。實際上setInterval
裡面的this
綁定到全局對象的。我們可以通過將this
列印出來驗證這一點:
function Counter() {
|
你會發現,整個window
對象被列印出來。 使用如下命令停止列印:
clearInterval(b.timer);
|
回到之前的函數,之所以列印NaN
,是因為this.num
綁定到window
對象的num
,而window.num
未定義。
那麼,我們如何解決這個問題呢?使用箭頭函數!使用箭頭函數就不會導致this
被綁定到全局對象。
function Counter() {
|
通過Counter
構造函數綁定的this
將會被保留。在setInterval
函數中,this
依然指向我們新創建的b
對象。
為了驗證剛剛的說法,我們可以將 Counter
函數中的this
綁定到that
, 然後在setInterval
中判斷this
和that
是否相同。
function Counter() {
|
正如我們期望的,列印值每次都是true
。最後,結束刷屏的列印:
clearInterval(b.timer);
|
總結
- 箭頭函數寫代碼擁有更加簡潔的語法;
- 不會綁定
this
。
本文轉載作者Fundebug
本文地址: https://blog.fundebug.com/2017/05/25/arrow-function-for-beginner/