成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

翻譯 | ES6 箭頭函數(shù)使用禁忌

ccj659 / 1902人閱讀

摘要:在需要?jiǎng)討B(tài)上下文的地方不能使用箭頭函數(shù),使用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí)不能使用箭頭函數(shù)等等。

作者:扉扉 (滬江web前端開(kāi)發(fā)工程師)
本文原創(chuàng)翻譯,有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請(qǐng)指明出處。

看到你每天使用的編程語(yǔ)言在不斷進(jìn)化是一件令人開(kāi)心的事情 。從錯(cuò)誤中學(xué)習(xí),找到更好的實(shí)現(xiàn)方式,創(chuàng)造新的語(yǔ)法特性,語(yǔ)言就這樣一步一步地實(shí)現(xiàn)了版本更新。

這正是近幾年Javascript身上發(fā)生的事情 ,ECMAScript6 引入了: 箭頭函數(shù),類(lèi)以及其它特性,真的太棒了!

其中一個(gè)非常好用的箭頭函數(shù),有許多文件介紹了了這個(gè)漂亮的語(yǔ)法糖,還具有透明上下文的作用(原文為 context transparency), 如果你對(duì)于ES6還不熟悉,請(qǐng)先閱讀箭頭函數(shù)的一些入門(mén)文章。

凡事都有兩面性,新的特性往往也會(huì)帶來(lái)新的困擾, 比如對(duì)箭頭函數(shù)的誤用。

這篇文章通過(guò)實(shí)際使用場(chǎng)景帶你了解在一些特定情況下到底是應(yīng)該使用傳統(tǒng)的函數(shù),還是該使用更簡(jiǎn)潔的箭頭函數(shù)。

1.在對(duì)象上定義方法

在javascript中,方法可以做為一個(gè)對(duì)象的屬性,當(dāng)調(diào)用這個(gè)方法時(shí), this 指向這個(gè)方法所屬的對(duì)象;

1a. 對(duì)象字面量

既然箭頭函數(shù)只是一個(gè)語(yǔ)法糖,那我們來(lái)嘗試一下使用箭頭函數(shù)做為一個(gè)對(duì)象的方法會(huì)發(fā)生什么:

var calculate = {  
  array: [1, 2, 3],
  sum: () => {
    console.log(this === window); // => true
    return this.array.reduce((result, item) => result + item);
  }
};
console.log(this === window); // => true  
// Throws"TypeError: Cannot read property "reduce" of undefined"
calculate.sum();

calculate.sum使用箭頭函數(shù)來(lái)定義,但是調(diào)用 calculate.sum() 時(shí)出現(xiàn)了異常。因?yàn)楫?dāng)執(zhí)行sum的時(shí)候上下文仍然是window,這是因?yàn)榧^函數(shù)已經(jīng)綁定了window做為上下文。

執(zhí)行this.array 等同于 window.array ,當(dāng)然是 undefined

解決辦法就是不要在對(duì)象的方法上使用箭頭函數(shù)短語(yǔ)法,這樣this關(guān)鍵字會(huì)在調(diào)用時(shí)決定,而不是早早綁定在閉合的上下文中, 讓我們看一下具體代碼:

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

對(duì)象原型

同樣的規(guī)則也適用于給對(duì)象prototype原型上定義方法:

function MyCat(name) {  
  this.catName = name;
}
MyCat.prototype.sayCatName = () => {  
  console.log(this === window); // => true
  returnthis.catName;
};
var cat = new MyCat("Mew");  
cat.sayCatName(); // => undefined  

使用傳統(tǒng)方式即可正常工作:

function MyCat(name) {  
  this.catName = name;
}
MyCat.prototype.sayCatName = function() {  
  console.log(this === cat); // => true
  returnthis.catName;
};
var cat = new MyCat("Mew");  
cat.sayCatName(); // => "Mew" 
2.動(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)的。

在客戶(hù)端,在dom元素上綁定事件監(jiān)聽(tīng)函數(shù)是非常普遍的行為,在dom事件被觸發(fā)時(shí),回調(diào)函數(shù)中的this指向該dom,可當(dāng)我們使用箭頭函數(shù)時(shí):

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á)式:

button.addEventListener("click", function() {  
    console.log(this === button); // => true
    this.innerHTML = "Clicked button";
});
3.調(diào)用構(gòu)造函數(shù)

當(dāng)函數(shù)做為構(gòu)造函數(shù)執(zhí)行時(shí) new MyFunction(),this指向新創(chuàng)建的對(duì)象實(shí)例:

this instanceOf MyFunction === true

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

因?yàn)槭褂眉^函數(shù)后this會(huì)指定閉合的當(dāng)前上下文,而當(dāng)函數(shù)做為構(gòu)造器的時(shí)候,this又會(huì)指向生成的實(shí)例, 這個(gè)造成歧義。

var Message = (text) => {  
  this.text = text;
};
// Throws "TypeError: Message is not a constructor"
var helloMessage = new Message("Hello World!");  

我們都知道使用函數(shù)表達(dá)式即可正常:

var Message = function(text) {  
  this.text = text;
};
var helloMessage = new Message("Hello World!");  
console.log(helloMessage.text); // => "Hello World!"  
4.超短的語(yǔ)法

箭頭函數(shù)可以讓語(yǔ)句寫(xiě)的非常的簡(jiǎn)潔,參數(shù)只有一個(gè)時(shí)可以省略(),函數(shù)體只有一句話可以省略{},如果返回值是一個(gè)表達(dá)式還甚至還可以省略return!

我的大學(xué)老師曾給我們布置了一道有趣的作業(yè): 使用C語(yǔ)言來(lái)編寫(xiě)一個(gè)計(jì)算字符串長(zhǎng)度的函數(shù),函數(shù)要盡可能的短,這是一個(gè)很好的方法去學(xué)習(xí)一門(mén)新的語(yǔ)言。

不過(guò)在真實(shí)生活中,代碼要被其它開(kāi)發(fā)者閱讀,超短的語(yǔ)法有時(shí)會(huì)讓你的同事陷入難以理解中。上代碼:

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;
}
 
letdouble = multiply(2);
 
double(3); // => 6
multiply(2, 3);// => 6

怎么樣是不是好理解多了?

如何平衡簡(jiǎn)潔與易理解也是使用箭頭函數(shù)需要注意的地方。

5.總結(jié)

毫無(wú)疑問(wèn),箭頭函數(shù)是一個(gè)很棒的特性。以前我們使用bind()函數(shù)或者需要固定上下文的地方現(xiàn)在使用箭頭函數(shù)會(huì)讓代碼更加簡(jiǎn)潔。

但有一些情況下,使用箭頭函數(shù)也有一些不便利。在需要?jiǎng)討B(tài)上下文的地方不能使用箭頭函數(shù),使用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí)不能使用箭頭函數(shù)等等。除去文中列舉不適合使用的情況下,盡情地使用箭頭函數(shù)吧。

原文地址:https://rainsoft.io/when-not-...

iKcamp原創(chuàng)新書(shū)《移動(dòng)Web前端高效開(kāi)發(fā)實(shí)戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開(kāi)售。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85113.html

相關(guān)文章

  • 普通函數(shù)箭頭函數(shù)

    摘要:普通函數(shù)和箭頭函數(shù)寫(xiě)在前面函數(shù)是里的一等公民。在客戶(hù)端,在元素上綁定事件監(jiān)聽(tīng)函數(shù)是非常普遍的行為,在事件被觸發(fā)時(shí),回調(diào)函數(shù)中的指向該可當(dāng)我們使用箭頭函數(shù)時(shí)因?yàn)檫@個(gè)回調(diào)的箭頭函數(shù)是在全局上下文中被定義的,所以他的是。 普通函數(shù)和箭頭函數(shù) 寫(xiě)在前面 函數(shù)(Function)是 JavaScript 里的‘一等公民’。是由稱(chēng)為函數(shù)體的一系列語(yǔ)句組成??梢援?dāng)做入?yún)?,出參(返回值)使用。和?duì)象一...

    王晗 評(píng)論0 收藏0
  • 2017-09-01 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選如何優(yōu)雅的編寫(xiě)代碼深入理解內(nèi)部機(jī)制專(zhuān)題之函數(shù)組合年月個(gè)有趣的和庫(kù)最經(jīng)典的前端面試題之一,你能答出什么幺蛾子中文翻譯深入理解響應(yīng)式原理掘金譯與和交互掘金箭頭函數(shù)使用禁忌技術(shù)棧耕耘助力美團(tuán)點(diǎn)評(píng)前端進(jìn)階之路前端模塊 2017-09-01 前端日?qǐng)?bào) 精選 如何優(yōu)雅的編寫(xiě) JavaScript 代碼深入理解 Node.js Stream 內(nèi)部機(jī)制JavaScript專(zhuān)題之函數(shù)組合20...

    Arno 評(píng)論0 收藏0
  • ES6 箭頭函數(shù)(arrow function)

    摘要:因?yàn)榧^函數(shù)沒(méi)有構(gòu)造方法。因?yàn)椴荒芤粋€(gè)箭頭函數(shù),所以也沒(méi)必要有了。的值在這個(gè)箭頭函數(shù)的整個(gè)生命周期里面都不變。你必須通過(guò)命名參數(shù)和剩余參數(shù)去獲取箭頭函數(shù)的參數(shù)。非箭頭函數(shù)在非嚴(yán)格模式下面可以有重名參數(shù)。 例行聲明:接下來(lái)的文字內(nèi)容全部來(lái)自 Understanding ECMAScript 6,作者是Nicholas C.Zakas,也就是大名鼎鼎的Professional JavaSc...

    Arno 評(píng)論0 收藏0
  • ES6新特性總結(jié) 一

    摘要:一旦聲明,常量的值不能被改變。頂層對(duì)象的屬性頂層對(duì)象,瀏覽器中指的是對(duì)象,在中指的是對(duì)象。中新增了兩個(gè)命令和,命令用于暴露出模塊對(duì)外的接口,而則用于輸入某一模塊。 1.聲明變量的關(guān)鍵字:const 和 let JavaScript ES6中引入了另外兩個(gè)聲明變量的關(guān)鍵字:const和let。在ES6中,我們將很少能看到var了。 const關(guān)鍵字 const聲明一個(gè)只讀的常量。一旦聲明...

    MarvinZhang 評(píng)論0 收藏0
  • ES6 系列之箭頭函數(shù)

    摘要:回顧我們先來(lái)回顧下箭頭函數(shù)的基本語(yǔ)法。主要區(qū)別包括沒(méi)有箭頭函數(shù)沒(méi)有,所以需要通過(guò)查找作用域鏈來(lái)確定的值。箭頭函數(shù)并沒(méi)有方法,不能被用作構(gòu)造函數(shù),如果通過(guò)的方式調(diào)用,會(huì)報(bào)錯(cuò)。 回顧 我們先來(lái)回顧下箭頭函數(shù)的基本語(yǔ)法。 ES6 增加了箭頭函數(shù): let func = value => value; 相當(dāng)于: let func = function (value) { return ...

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

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

0條評(píng)論

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