ES6 常用特性(二)

箭頭函數

箭頭函數無疑是 ES6 中一個相當重要的新特性。

特性

1、共享父級 this 對象
2、共享父級 arguments
3、不能當做構造函數

語法

最簡表達式
var arr = [1, 2, 3, 4, 5, 6];
// Before
arr.filter(function(v) {
    return v > 3;
});
// After
arr.filter(v => v > 3); // => [4, 5, 6]
//前后對比很容易理解,可以明顯看出箭頭函數極大地減少了代碼量。
完整語法

var arr = [1, 2, 3, 4, 5, 6];

arr.map((v, k, thisArr) => {
    return thisArr.reverse()[k] * v;
})  // => [6, 10, 12, 12, 10, 6]
  一個簡單的首尾相乘的算法,對比最簡表達式我們可以發現,函數的前邊都省略了 function 關鍵字,但是多個入參時需用括號包裹入參,單個入參是時可省略括號,入參寫法保持一致。后面使用胖箭頭 => 連接函數名與函數體,函數體的寫法保持不變。
函數上下文 this

// Before
var obj = {
    arr: [1, 2, 3, 4, 5, 6],
    getMaxPow2: function() {
        var that = this,
            getMax = function() {
                return Math.max.apply({}, that.arr);
            };
        
        return Math.pow(getMax(), 2);
    }
}
// After
var obj = {
    arr: [1, 2, 3, 4, 5, 6],
    getMaxPow2: function() {
        var getMax = () => {
            return Math.max.apply({}, this.arr);
        }

        return Math.pow(getMax(), 2);
    }
}

注意看中第 5 行 var that = this 這里聲明的一個臨時變量 that。在對象或者原型鏈中,我們以前經常會寫這樣一個臨時變量,或 that 或 _this,諸如此類,以達到在一個函數內部訪問到父級或者祖先級 this 對象的目的。

如今在箭頭函數中,函數體內部沒有自己的 this,默認在其內部調用 this 的時候,會自動查找其父級上下文的 this 對象(如果父級同樣是箭頭函數,則會按照作用域鏈繼續向上查找),這無疑方便了許多,我們無需在多余地聲明一個臨時變量來做這件事了。

注意:某些情況下我們可能需要函數有自己的 this,例如 DOM 事件綁定時事件回調函數中,我們往往需要使用 this 來操作當前的 DOM,這時候就需要使用傳統匿名函數而非箭頭函數。
在嚴格模式下,如果箭頭函數的上層函數均為箭頭函數,那么 this 對象將不可用。
另,由于箭頭函數沒有自己的 this 對象,所以箭頭函數不能當做構造函數。
父級函數 arguments

我們知道在函數體中有 arguments 這樣一個偽數組對象,該對象中包含該函數所有的入參(顯示入參 + 隱式入參),當函數體中有另外一個函數,并且該函數為箭頭函數時,該箭頭函數的函數體中可以直接訪問父級函數的 arguments 對象。

function getSum() {
    var example = () => {
        return Array
            .prototype
            .reduce
            .call(arguments, (pre, cur) => pre + cur);
    }

    return example();
}
getSum(1, 2, 3); // => 6

由于箭頭函數本身沒有 arguments 對象,所以如果他的上層函數都是箭頭函數的話,那么 arguments 對象將不可用。

當箭頭函數入參只有一個時可以省略入參括號;
當入參多余一個或沒有入參時必須寫括號;
當函數體只有一個 return 語句時可以省略函數體的花括號與 return 關鍵字。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容