欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年06月07日 10:33:00   作者:  
這篇文章主要介紹了ECMAScript6的新特性箭頭函數(shù)(Arrow Function)詳細(xì)介紹,ECMAScript6其實(shí)就是JavaScript,它的新特性就是JS的新特性,引入只是時(shí)間問(wèn)題,需要的朋友可以參考下

箭頭函數(shù)是ECMAScript 6最受關(guān)注的更新內(nèi)容之一。它引入了一種用「箭頭」(=>)來(lái)定義函數(shù)的新語(yǔ)法,它…它碉堡了~。箭頭函數(shù)與傳統(tǒng)的JavaScript函數(shù)主要區(qū)別在于以下幾點(diǎn):
1.對(duì) this 的關(guān)聯(lián)。函數(shù)內(nèi)置 this 的值,取決于箭頭函數(shù)在哪兒定義,而非箭頭函數(shù)執(zhí)行的上下文環(huán)境。
2.new 不可用。箭頭函數(shù)不能使用 new 關(guān)鍵字來(lái)實(shí)例化對(duì)象,不然會(huì)報(bào)錯(cuò)。
3.this 不可變。函數(shù)內(nèi)置 this 不可變,在函數(shù)體內(nèi)整個(gè)執(zhí)行環(huán)境中為常量。
4.沒(méi)有arguments對(duì)象。更不能通過(guò)arguments對(duì)象訪問(wèn)傳入?yún)?shù)。只能使用顯式命名或其他ES6新特性來(lái)完成。

這些差異的存在是有理可循的。首先,對(duì)this的綁定是JavaScript錯(cuò)誤的常見(jiàn)來(lái)源之一。容易丟失函數(shù)內(nèi)置數(shù)值,或得出意外結(jié)果。其次,將箭頭函數(shù)限制為使用固定this引用,有利于JavaScript引擎優(yōu)化處理。

一、語(yǔ)法

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

復(fù)制代碼 代碼如下:

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

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

可以看出,傳一個(gè)參數(shù)就直接寫(xiě)就好了,不用加小括號(hào)。箭頭指向函數(shù)主體,不過(guò)函數(shù)主體也只是簡(jiǎn)單的一條返回語(yǔ)句,所以也不用加大括號(hào)。函數(shù)構(gòu)造完畢賦給reflect加以引用。
若需傳入多個(gè)參數(shù),則應(yīng)加上小括號(hào)。例如:

復(fù)制代碼 代碼如下:

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

sum()方法為兩參數(shù)相加并回傳結(jié)果。跟前一個(gè)例子的唯一區(qū)別是傳入了兩個(gè)參數(shù),所以要用小括號(hào)括起來(lái)。它與傳統(tǒng)函數(shù)一樣,括號(hào)內(nèi)由逗號(hào)將傳入?yún)?shù)分開(kāi)。同樣,如果該函數(shù)不需要傳入?yún)?shù),那也要以空括號(hào)來(lái)代替。

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

若你想使用標(biāo)準(zhǔn)的函數(shù)體,或者函數(shù)體內(nèi)可能有更多的語(yǔ)句要執(zhí)行,則要用大括號(hào)將函數(shù)體括起來(lái),并明確定義返回值。例如:

復(fù)制代碼 代碼如下:

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

大括號(hào)內(nèi)的部分基本等同于傳統(tǒng)函數(shù),除了arguments參數(shù)不可用外。
因?yàn)榇罄ㄌ?hào)是函數(shù)主體的標(biāo)志。而箭頭函數(shù)若要返回自定義對(duì)象的話,就必須用小括號(hào)把該對(duì)象括起來(lái)先。例如:

復(fù)制代碼 代碼如下:

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

上例可以看出,用小括號(hào)包含大括號(hào)則是對(duì)象的定義,而非函數(shù)主體。

二、使用

JavaScript最常見(jiàn)錯(cuò)誤之一就是函數(shù)內(nèi)部this關(guān)聯(lián)。因?yàn)閠his是根據(jù)函數(shù)當(dāng)前的執(zhí)行環(huán)境去取值的,這樣就會(huì)在調(diào)用時(shí)產(chǎn)生誤解,以導(dǎo)致對(duì)其他的不相關(guān)對(duì)象產(chǎn)生了影響。參見(jiàn)下例:

復(fù)制代碼 代碼如下:

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()方法用于構(gòu)建交互作用,并在點(diǎn)擊事件處理函數(shù)中調(diào)用this.doSomething()。但是代碼并未按設(shè)計(jì)初衷來(lái)執(zhí)行,運(yùn)行時(shí)this指向了全局對(duì)象而不是PageHandler,從而造成this.doSomething()調(diào)用無(wú)效出現(xiàn)報(bào)錯(cuò),因?yàn)槿謱?duì)象中不存在doSomething方法。
當(dāng)然,可以在函數(shù)中使用bind()將this與PageHandler明確關(guān)聯(lián)起來(lái),見(jiàn)下:

復(fù)制代碼 代碼如下:

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);
    }
};

雖然看著有些怪,但現(xiàn)在代碼執(zhí)行是符合預(yù)期的。通過(guò)調(diào)用函數(shù)的bind(this),又創(chuàng)建了一個(gè)已關(guān)聯(lián)現(xiàn)有this的新函數(shù)返回,就是說(shuō)為了達(dá)到目的額外又包了一層。
因?yàn)榧^函數(shù)已經(jīng)支持this關(guān)聯(lián),所以這里用箭頭函數(shù)會(huì)更爽快些,看下例:
復(fù)制代碼 代碼如下:

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);
    }
};

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

復(fù)制代碼 代碼如下:

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

上例用了許多語(yǔ)法來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的操作。若使用箭頭函數(shù),則可寫(xiě)成很精煉的代碼:

復(fù)制代碼 代碼如下:

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

數(shù)組的sort/map/reduce等方法都支持回調(diào)函數(shù)。用箭頭函數(shù)可以簡(jiǎn)化書(shū)寫(xiě)流程,解放你的雙手去做你想做的事情。

三、補(bǔ)充

箭頭函數(shù)的確與傳統(tǒng)函數(shù)有不同之處,但仍存在共同的特點(diǎn)。例如:
1.對(duì)箭頭函數(shù)進(jìn)行typeof操作會(huì)返回“function”。
2.箭頭函數(shù)仍是Function的實(shí)例,故而instanceof的執(zhí)行方式與傳統(tǒng)函數(shù)一致。
3.call/apply/bind方法仍適用于箭頭函數(shù),但就算調(diào)用這些方法擴(kuò)充當(dāng)前作用域,this也依舊不會(huì)變化。
箭頭函數(shù)與傳統(tǒng)函數(shù)最大的不同之處在,禁用new操作。


四、結(jié)論

箭頭函數(shù)是ECMAScript 6一個(gè)備受關(guān)注的新特性,并且還在不斷的優(yōu)化著。用簡(jiǎn)短語(yǔ)法以定義函數(shù)或語(yǔ)句書(shū)寫(xiě)流程是大勢(shì)所趨,他們必將屌炸天,無(wú)人可阻。它對(duì)關(guān)鍵字this的關(guān)聯(lián)讓開(kāi)發(fā)者不再神煩,并通過(guò)JavaScript引擎優(yōu)化,幫助其提高表現(xiàn)。說(shuō)到這里,小伙伴們的大刀已經(jīng)饑渴難耐了吧,若想試用箭頭函數(shù),打開(kāi)最新版本的Firefox即可。

相關(guān)文章

  • JavaScript基礎(chǔ)心法 深淺拷貝(淺拷貝和深拷貝)

    JavaScript基礎(chǔ)心法 深淺拷貝(淺拷貝和深拷貝)

    淺拷貝和深拷貝都是對(duì)于JS中的引用類型而言的,淺拷貝就只是復(fù)制對(duì)象的引用,如果拷貝后的對(duì)象發(fā)生變化,原對(duì)象也會(huì)發(fā)生變化。只有深拷貝才是真正地對(duì)對(duì)象的拷貝
    2018-03-03
  • JavaScript 創(chuàng)建運(yùn)動(dòng)框架的實(shí)現(xiàn)代碼

    JavaScript 創(chuàng)建運(yùn)動(dòng)框架的實(shí)現(xiàn)代碼

    本篇文章是對(duì),在JavaScript中創(chuàng)建運(yùn)動(dòng)框架的實(shí)現(xiàn)方法進(jìn)行了介紹。需要的朋友參考下
    2013-05-05
  • ECMAScript6 新特性范例大全

    ECMAScript6 新特性范例大全

    本文沒(méi)有詳細(xì)描述這些新特性,因?yàn)榫W(wǎng)上都已經(jīng)有很多相關(guān)的介紹了。主要針對(duì)ES6 新特性收集了相關(guān)范例代碼,他可以讓你快速了解這個(gè)新的javascript規(guī)范
    2017-03-03
  • 分享5個(gè)頂級(jí)的JavaScript Ajax組件庫(kù)

    分享5個(gè)頂級(jí)的JavaScript Ajax組件庫(kù)

    AJAX是用來(lái)對(duì)服務(wù)器進(jìn)行異步HTTP調(diào)用的一系列web開(kāi)發(fā)技術(shù)客戶端框架,本文為大家分享了5個(gè)頂級(jí)的JavaScript Ajax組件庫(kù)
    2018-09-09
  • JavaScript基礎(chǔ)之對(duì)象

    JavaScript基礎(chǔ)之對(duì)象

    這篇文章主要介紹了如何理解JavaScript中的對(duì)象,幫助大家更好的學(xué)習(xí)JavaScript,感興趣的朋友可以了解下
    2021-11-11
  • JavaScript與DOM組合動(dòng)態(tài)創(chuàng)建表格實(shí)例

    JavaScript與DOM組合動(dòng)態(tài)創(chuàng)建表格實(shí)例

    這篇文章簡(jiǎn)單介紹了DOM 1.0一些基本而強(qiáng)大的方法以及如何在JavaScript中使用它們;你可以學(xué)到如何動(dòng)態(tài)地創(chuàng)建、獲取、控制和刪除HTML元素
    2012-12-12
  • DOM 事件流詳解

    DOM 事件流詳解

    這篇文章主要詳細(xì)介紹了DOM中的事件流,包括冒泡型事件、事件監(jiān)聽(tīng)、標(biāo)準(zhǔn)DOM事件監(jiān)聽(tīng)這三個(gè)方面,十分詳細(xì),推薦給大家。
    2015-01-01
  • 淺析JavaScript中的typeof運(yùn)算符

    淺析JavaScript中的typeof運(yùn)算符

    這篇文章主要是對(duì)JavaScript中的typeof運(yùn)算符進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-11-11
  • 深入解析JavaScript的閉包機(jī)制

    深入解析JavaScript的閉包機(jī)制

    這篇文章主要介紹了JavaScript的閉包機(jī)制,針對(duì)內(nèi)嵌函數(shù)的變量訪問(wèn)等問(wèn)題分析了JS的閉包,需要的朋友可以參考下
    2015-10-10
  • javascript中clone對(duì)象詳解

    javascript中clone對(duì)象詳解

    這篇文章主要介紹了javascript中clone對(duì)象的方法,需要的朋友可以參考下
    2014-12-12

最新評(píng)論