国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

ECMAScript6的新特性箭頭函數(Arrow Function)詳細介紹

2019-11-20 14:45:31
字體:
來源:轉載
供稿:網友

箭頭函數是ECMAScript 6最受關注的更新內容之一。它引入了一種用「箭頭」(=>)來定義函數的新語法,它…它碉堡了~。箭頭函數與傳統的JavaScript函數主要區別在于以下幾點:
1.對 this 的關聯。函數內置 this 的值,取決于箭頭函數在哪兒定義,而非箭頭函數執行的上下文環境。
2.new 不可用。箭頭函數不能使用 new 關鍵字來實例化對象,不然會報錯。
3.this 不可變。函數內置 this 不可變,在函數體內整個執行環境中為常量。
4.沒有arguments對象。更不能通過arguments對象訪問傳入參數。只能使用顯式命名或其他ES6新特性來完成。

這些差異的存在是有理可循的。首先,對this的綁定是JavaScript錯誤的常見來源之一。容易丟失函數內置數值,或得出意外結果。其次,將箭頭函數限制為使用固定this引用,有利于JavaScript引擎優化處理。

一、語法

箭頭函數的語法很簡單,定義自變量,然后是箭頭和函數主體。自變量和主題因使用不同可以采用更簡潔的格式。下面這個例子就是采用傳一個參數和返回一個值的箭頭函數。

復制代碼 代碼如下:

var reflect = value => value;
// 等同于:

var reflect = function(value) {
    return value;
};

可以看出,傳一個參數就直接寫就好了,不用加小括號。箭頭指向函數主體,不過函數主體也只是簡單的一條返回語句,所以也不用加大括號。函數構造完畢賦給reflect加以引用。
若需傳入多個參數,則應加上小括號。例如:

復制代碼 代碼如下:

var sum = (num1, num2) => num1 + num2;
// 等同于:
var sum = function(num1, num2) {
    return num1 + num2;
 };

sum()方法為兩參數相加并回傳結果。跟前一個例子的唯一區別是傳入了兩個參數,所以要用小括號括起來。它與傳統函數一樣,括號內由逗號將傳入參數分開。同樣,如果該函數不需要傳入參數,那也要以空括號來代替。

復制代碼 代碼如下:
var sum = () => 1 + 2;
// 等同于:
var sum = function() {
    return 1 + 2;
 };

若你想使用標準的函數體,或者函數體內可能有更多的語句要執行,則要用大括號將函數體括起來,并明確定義返回值。例如:

復制代碼 代碼如下:

var sum = (num1, num2) => { return num1 + num2; }
//等同于:
var sum = function(num1, num2) {
    return num1 + num2;
 };

大括號內的部分基本等同于傳統函數,除了arguments參數不可用外。
因為大括號是函數主體的標志。而箭頭函數若要返回自定義對象的話,就必須用小括號把該對象括起來先。例如:

復制代碼 代碼如下:

var getTempItem = id = > ({
    id: id,
    name: "Temp"
});
// 等同于:
var getTempItem = function(id) {
    return {
        id: id,
        name: "Temp"
    };
};

上例可以看出,用小括號包含大括號則是對象的定義,而非函數主體。

二、使用

JavaScript最常見錯誤之一就是函數內部this關聯。因為this是根據函數當前的執行環境去取值的,這樣就會在調用時產生誤解,以導致對其他的不相關對象產生了影響。參見下例:

復制代碼 代碼如下:

var PageHandler = {
    id: "123456",
    init: function() {
        document.addEventListener("click", function(event) {
            this.doSomething(event.type); // error
        }, false);
    },
    doSomething: function(type) {
        console.log("Handling " + type + " for " + this.id);
    }
};

在這段代碼中,本意是想讓PageHandler的init()方法用于構建交互作用,并在點擊事件處理函數中調用this.doSomething()。但是代碼并未按設計初衷來執行,運行時this指向了全局對象而不是PageHandler,從而造成this.doSomething()調用無效出現報錯,因為全局對象中不存在doSomething方法。
當然,可以在函數中使用bind()將this與PageHandler明確關聯起來,見下:

復制代碼 代碼如下:

var PageHandler = {

    id: "123456",

    init: function() {
        document.addEventListener("click", (function(event) {
            this.doSomething(event.type);
        }).bind(this), false);
    },

    doSomething: function(type) {
        console.log("Handling " + type + " for " + this.id);
    }
};

雖然看著有些怪,但現在代碼執行是符合預期的。通過調用函數的bind(this),又創建了一個已關聯現有this的新函數返回,就是說為了達到目的額外又包了一層。
因為箭頭函數已經支持this關聯,所以這里用箭頭函數會更爽快些,看下例:
復制代碼 代碼如下:

var PageHandler = {

    id: "123456",

    init: function() {
        document.addEventListener("click",
        event = > this.doSomething(event.type), false);
    },

    doSomething: function(type) {
        console.log("Handling " + type + " for " + this.id);
    }
};

這個實例中的事件處理函數調用了this.doSomething()的箭頭函數。this的取值即為init()內的this值。故而它等效于bind()。
箭頭函數簡明扼要的特性,也使它成為其他函數自變量的理想選擇。例如,若要在ES5上,使用定制比較器來排列數組,典型的代碼見下:

復制代碼 代碼如下:

var result = values.sort(function(a, b) {
        return a - b;
 });

上例用了許多語法來實現一個簡單的操作。若使用箭頭函數,則可寫成很精煉的代碼:

復制代碼 代碼如下:

var result = values.sort((a, b) => a - b);

數組的sort/map/reduce等方法都支持回調函數。用箭頭函數可以簡化書寫流程,解放你的雙手去做你想做的事情。

三、補充

箭頭函數的確與傳統函數有不同之處,但仍存在共同的特點。例如:
1.對箭頭函數進行typeof操作會返回“function”。
2.箭頭函數仍是Function的實例,故而instanceof的執行方式與傳統函數一致。
3.call/apply/bind方法仍適用于箭頭函數,但就算調用這些方法擴充當前作用域,this也依舊不會變化。
箭頭函數與傳統函數最大的不同之處在,禁用new操作。


四、結論

箭頭函數是ECMAScript 6一個備受關注的新特性,并且還在不斷的優化著。用簡短語法以定義函數或語句書寫流程是大勢所趨,他們必將

主站蜘蛛池模板: 平定县| 曲靖市| 黑河市| 阜康市| 永年县| 拉孜县| 乌兰浩特市| 穆棱市| 祁连县| 西丰县| 酒泉市| 黄骅市| 唐山市| 江源县| 崇州市| 孝昌县| 铁岭县| 永兴县| 尉犁县| 万源市| 新密市| 阿瓦提县| 浑源县| 奈曼旗| 遂川县| 和平区| 哈尔滨市| 滨州市| 克山县| 甘泉县| 汾阳市| 沙河市| 新兴县| 林甸县| 枝江市| 安康市| 嘉祥县| 孙吴县| 广河县| 军事| 陵川县|