国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

什么時(shí)候不該使用es6箭頭函數(shù)

fizz / 650人閱讀

摘要:我們?cè)谛枰獎(jiǎng)討B(tài)上下文的地方不能使用箭頭函數(shù)定義需要?jiǎng)討B(tài)上下文的函數(shù),構(gòu)造函數(shù),需要對(duì)象作為目標(biāo)的回調(diào)函數(shù)以及用箭頭函數(shù)難以理解的語(yǔ)句。

從開(kāi)始接觸es6到在項(xiàng)目中使用已經(jīng)有一段時(shí)間了,es6有很多優(yōu)秀的新特性,其中最有價(jià)值的特性之一就是箭頭函數(shù),他簡(jiǎn)潔的語(yǔ)法以及更好理解的this值都非常的吸引我。但是新事物也是有兩面性的,箭頭函數(shù)有他的便捷有他的優(yōu)點(diǎn),但是他也有缺點(diǎn),他的優(yōu)點(diǎn)是代碼簡(jiǎn)潔,this提前定義,但他的缺點(diǎn)也是這些,比如代碼太過(guò)簡(jiǎn)潔,導(dǎo)致不好閱讀,this提前定義,導(dǎo)致無(wú)法使用js進(jìn)行一些es5里面看起來(lái)非常正常的操作。針對(duì)這些缺點(diǎn),下面我就總結(jié)一下什么情況下不該使用箭頭函數(shù)。

1.在對(duì)象上定義函數(shù)

先來(lái)看下面這段代碼

var obj = {  
    array: [1, 2, 3],
    sum: () => {
        console.log(this === window); // => true
        return this.array.reduce((result, item) => result + item);
    }
};

// Throws "TypeError: Cannot read property "reduce" of undefined"
obj.sum();  

sum方法定義在obj對(duì)象上,當(dāng)調(diào)用的時(shí)候我們發(fā)現(xiàn)拋出了一個(gè)TypeError,因?yàn)楹瘮?shù)中的thiswindow對(duì)象,所以this.array也就是undefined。原因也很簡(jiǎn)單,相信只要了解過(guò)es6 箭頭函數(shù)的都知道

箭頭函數(shù)沒(méi)有它自己的this值,箭頭函數(shù)內(nèi)的this值繼承自外圍作用域

解決方法也很簡(jiǎn)單,就是不用唄。這里可以用es6里函數(shù)表達(dá)式的簡(jiǎn)潔語(yǔ)法,在這種情況下,this值就取決于函數(shù)的調(diào)用方式了。

var obj = {  
    array: [1, 2, 3],
    sum() {
        console.log(this === obj); // => true
        return this.array.reduce((result, item) => result + item);
    }
};

obj.sum(); // => 6  

通過(guò)object.method()語(yǔ)法調(diào)用的方法使用非箭頭函數(shù)定義,這些函數(shù)需要從調(diào)用者的作用域中獲取一個(gè)有意義的this值。

2.在原型上定義函數(shù)

在對(duì)象原型上定義函數(shù)也是遵循著一樣的規(guī)則

function Person (pName) {
    this.pName = pName;
}

Person.prototype.sayName = () => {
    console.log(this === window); // => true
    return this.pName;
}

var person = new Person("wdg");

person.sayName(); // => undefined

使用function函數(shù)表達(dá)式

function Person (pName) {
    this.pName = pName;
}

Person.prototype.sayName = function () {
    console.log(this === person); // => true
    return this.pName;
}

var person = new Person("wdg");

person.sayName(); // => wdg

所以給對(duì)象原型掛載方法時(shí),使用function函數(shù)表達(dá)式

3.動(dòng)態(tài)上下文中的回調(diào)函數(shù)

this是js中非常強(qiáng)大的特點(diǎn),他讓函數(shù)可以根據(jù)其調(diào)用方式動(dòng)態(tài)的改變上下文,然后箭頭函數(shù)直接在聲明時(shí)就綁定了this對(duì)象,所以不再是動(dòng)態(tài)的。
在客戶端,在dom元素上綁定事件監(jiān)聽(tīng)函數(shù)是非常普遍的行為,在dom事件被觸發(fā)時(shí),回調(diào)函數(shù)中的this指向該dom,可當(dāng)我們使用箭頭函數(shù)時(shí):

var button = document.getElementById("myButton");  
button.addEventListener("click", () => {  
    console.log(this === window); // => true
    this.innerHTML = "Clicked button";
});

因?yàn)檫@個(gè)回調(diào)的箭頭函數(shù)是在全局上下文中被定義的,所以他的this是window。所以當(dāng)this是由目標(biāo)對(duì)象決定時(shí),我們應(yīng)該使用函數(shù)表達(dá)式:

var button = document.getElementById("myButton");  
button.addEventListener("click", function() {  
    console.log(this === button); // => true
    this.innerHTML = "Clicked button";
});
4.構(gòu)造函數(shù)中

在構(gòu)造函數(shù)中,this指向新創(chuàng)建的對(duì)象實(shí)例

this instanceOf MyFunction === true

需要注意的是,構(gòu)造函數(shù)不能使用箭頭函數(shù),如果這樣做會(huì)拋出異常

var Person = (name) => {
    this.name = name;
}

// Uncaught TypeError: Person is not a constructor
var person = new Person("wdg");

理論上來(lái)說(shuō)也是不能這么做的,因?yàn)榧^函數(shù)在創(chuàng)建時(shí)this對(duì)象就綁定了,更不會(huì)指向?qū)ο髮?shí)例。

5.太簡(jiǎn)短的(難以理解)函數(shù)

箭頭函數(shù)可以讓語(yǔ)句寫(xiě)的非常的簡(jiǎn)潔,但是一個(gè)真實(shí)的項(xiàng)目,一般由多個(gè)開(kāi)發(fā)者共同協(xié)作完成,就算由單人完成,后期也并不一定是同一個(gè)人維護(hù),箭頭函數(shù)有時(shí)候并不會(huì)讓人很好的理解,比如

let multiply = (a, b) => b === undefined ? b => a * b : a * b;

let double = multiply(2);

double(3); // => 6

multiply(2, 3); // =>6

這個(gè)函數(shù)的作用就是當(dāng)只有一個(gè)參數(shù)a時(shí),返回接受一個(gè)參數(shù)b返回a*b的函數(shù),接收兩個(gè)參數(shù)時(shí)直接返回乘積,這個(gè)函數(shù)可以很好的工作并且看起很簡(jiǎn)潔,但是從第一眼看去并不是很好理解。
為了讓這個(gè)函數(shù)更好的讓人理解,我們可以為這個(gè)箭頭函數(shù)加一對(duì)花括號(hào),并加上return語(yǔ)句,或者直接使用函數(shù)表達(dá)式:

function multiply(a, b) {
    if (b === undefined) {
        return function (b) {
            return a * b;
        }
    }
    return a * b;
}

let double = multiply(2);

double(3); // => 6
multiply(2, 3); // => 6
總結(jié)

毫無(wú)疑問(wèn),箭頭函數(shù)帶來(lái)了很多便利。恰當(dāng)?shù)氖褂眉^函數(shù)可以讓我們避免使用早期的.bind()函數(shù)或者需要固定上下文的地方并且讓代碼更加簡(jiǎn)潔。
箭頭函數(shù)也有一些不便利的地方。我們?cè)谛枰獎(jiǎng)討B(tài)上下文的地方不能使用箭頭函數(shù):定義需要?jiǎng)討B(tài)上下文的函數(shù),構(gòu)造函數(shù),需要this對(duì)象作為目標(biāo)的回調(diào)函數(shù)以及用箭頭函數(shù)難以理解的語(yǔ)句。在其他情況下,請(qǐng)盡情的使用箭頭函數(shù)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80600.html

相關(guān)文章

  • ES6-箭頭函數(shù)

    摘要:編程中經(jīng)常定義一些短小的匿名函數(shù),使用箭頭函數(shù)語(yǔ)法可使得這類(lèi)函數(shù)的定義更加簡(jiǎn)潔。外部函數(shù)的,等價(jià)于定義個(gè)局部變量修改內(nèi)部的所以這樣,,也就無(wú)法修改箭頭函數(shù)的值的。拋異常即箭頭函數(shù)不能作為構(gòu)造函數(shù),其也不具有屬性。 一、概述 箭頭函數(shù)是指通過(guò)=>語(yǔ)法定義的函數(shù)。JS編程中經(jīng)常定義一些短小的匿名函數(shù),使用箭頭函數(shù)語(yǔ)法可使得這類(lèi)函數(shù)的定義更加簡(jiǎn)潔。 // ES3/5方式 var fun1 =...

    wapeyang 評(píng)論0 收藏0
  • ES6-Generator與react狀態(tài)機(jī)(13)

    摘要:同理,你只要知道改變狀態(tài)能夠?qū)崿F(xiàn)要的功能,大體上的原理就是狀態(tài)機(jī)就可以了。總結(jié),本文重點(diǎn)狀態(tài)機(jī)模式的使用場(chǎng)景,復(fù)雜多狀態(tài)的管理,這里注意你沒(méi)必要寫(xiě)個(gè)選項(xiàng)卡之類(lèi)的用狀態(tài)機(jī),那反而是給自己找麻煩。 大家在寫(xiě)App和一些單頁(yè)面程序的時(shí)候,經(jīng)常會(huì)遇到這樣的情況:showImg(https://segmentfault.com/img/bVbsNaA?w=240&h=427);當(dāng)點(diǎn)擊左邊的箭頭的...

    alphahans 評(píng)論0 收藏0
  • 每日 30 秒 ? 該不該優(yōu)雅

    showImg(https://segmentfault.com/img/remote/1460000018734296?w=900&h=500); 簡(jiǎn)介 可讀性、性能、Spread、Reduce 在 優(yōu)雅三連擊 中有同學(xué)提到了 可讀性 這個(gè)關(guān)鍵詞,就小二個(gè)人的觀點(diǎn) 在某個(gè)范圍內(nèi)使用比較常用到的小技巧,可以提升一定的可讀性,文中提到的短路運(yùn)算在初始化變量是提升可讀性的,并且在很多提倡優(yōu)化if 語(yǔ)句...

    JohnLui 評(píng)論0 收藏0
  • JavaScript & 6小時(shí)了解ES6基本語(yǔ)法

    摘要:返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。參考語(yǔ)法返回一個(gè)布爾值與的全等操作符比較兼容環(huán)境把對(duì)象的值復(fù)制到另一個(gè)對(duì)象里淺拷貝定義方法用于將所有可枚舉的屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象。語(yǔ)法要設(shè)置其原型的對(duì)象。 一步一步似爪牙。 前言 學(xué)習(xí)es6之前我們可能并不知道es6相比es5差距在哪, 但是這并不妨礙我們站在巨人的肩膀上; 程序員就是要樂(lè)于嘗鮮; 學(xué)習(xí)es6最終目的是...

    Amos 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<