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

資訊專欄INFORMATION COLUMN

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

王晗 / 3198人閱讀

摘要:普通函數(shù)和箭頭函數(shù)寫(xiě)在前面函數(shù)是里的一等公民。在客戶端,在元素上綁定事件監(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 里的‘一等公民’。是由稱為函數(shù)體的一系列語(yǔ)句組成??梢援?dāng)做入?yún)ⅲ鰠ⅲǚ祷刂担┦褂?。和?duì)象一樣,有自己的屬性和方法。區(qū)別之處在于可以被調(diào)用。數(shù)據(jù)類型是 function(用 typeof 判斷),用 Object.prototype.toString.call() 判斷是 [object Function]。如果沒(méi)有使用 retrun 語(yǔ)句,則默認(rèn)返回 undefined。反之則函數(shù)必須使用 return 語(yǔ)句來(lái)指定一個(gè)要返回的值。(使用 new 關(guān)鍵字調(diào)用一個(gè)構(gòu)造函數(shù)除外,不再是實(shí)例化一個(gè)對(duì)象)。函數(shù)執(zhí)行時(shí),this 關(guān)鍵字并不會(huì)指向正在運(yùn)行的函數(shù)本身,而是指向調(diào)用該函數(shù)的對(duì)象。
函數(shù)表達(dá)式不會(huì)提升,因此在使用之前必須先聲明。和用 var 聲明變量不一樣。

產(chǎn)生原因

箭頭函數(shù)的產(chǎn)生原因就是在于 this 關(guān)鍵字指向問(wèn)題。它很容易讓人產(chǎn)生疑惑,尤其是當(dāng)函數(shù)調(diào)用層級(jí)比較多的時(shí)候。和傳統(tǒng)函數(shù)定義相比,語(yǔ)法也相對(duì)簡(jiǎn)潔。并且沒(méi)有自己的this,arguments,supernew.target。這些函數(shù)表達(dá)式更適用于那些本來(lái)需要匿名函數(shù)的地方,并且它們不能用作構(gòu)造函數(shù)。箭頭函數(shù) this 指向的固定化,并不是因?yàn)楹瘮?shù)內(nèi)部做了處理,而是因?yàn)榧^函數(shù)在創(chuàng)建的時(shí)候根本就沒(méi)有自己的 this

使用箭頭函數(shù)需要注意的點(diǎn)

1,函數(shù)體內(nèi)的 this 對(duì)象,是定義時(shí)所在對(duì)象,而不是調(diào)用該函數(shù)的對(duì)象。
2,正因?yàn)樽约罕旧頉](méi)有 this 對(duì)象,因此不可以用作構(gòu)造函數(shù),不能用 call(),apply(),bind()這些方法去改變 this 的指向。
3,不綁定 arguments 對(duì)象,可以使用 rest 參數(shù)來(lái)解決。
4,嚴(yán)格模式(use strict)中,指定的與 this 相關(guān)的規(guī)則都將被忽略。

var aaa = () => {
    "use strict";
    console.log(this);
    // window
}

var bbb = function() {
    "use strict";
    console.log(this);
    // undefined
}

5,不能使用 new 操作符,否則會(huì)報(bào)錯(cuò)

var Func = () => {};
var func = new Func();
// TypeError: Func is not a constructor

6,沒(méi)有 prototype 屬性

var Func = () => {};
console.log(Func.prototype);
// undefined

7,不能用作生成器。 yield 關(guān)鍵字通常不能在箭頭函數(shù)中使用(除非是嵌套在允許使用的函數(shù)內(nèi))。
8,箭頭函數(shù)的簡(jiǎn)寫(xiě),可以直接省略 return,在塊體中,必須使用明確的 return 語(yǔ)句。如果需要返回對(duì)象字面量的話,記得用圓括號(hào)包起來(lái)。

var func = () => ({num: 1});
寫(xiě)在后面

拋一個(gè)大佬留下的問(wèn)題,有箭頭函數(shù)的 IIEF:

(() => {
console.log("執(zhí)行看看");
// 執(zhí)行看看
})(); 

這個(gè)是可以的,但是下面的寫(xiě)法就會(huì)報(bào)錯(cuò)

(() => {
console.log("執(zhí)行看看");
// Uncaught SyntaxError: Unexpected token (
}());

有知道原因的小伙伴嗎?

2018-07-18
補(bǔ)充一下幾點(diǎn):
1,在對(duì)象字面量上定義方法,會(huì)出現(xiàn)問(wèn)題
如下代碼執(zhí)行:

var obj = {
  i: 10,
  b: () => console.log(this.i, this),
  c: function() {
    console.log( this.i, this)
  },
  d() {
    console.log( this.i, this)  
  }
}
obj.b(); 
// undefined Window
obj.c();
// 10 obj對(duì)象
obj.d(); 
// 10 obj對(duì)象

obj.b 使用箭頭函數(shù)來(lái)定義,但是調(diào)用 obj.b() 時(shí)出現(xiàn)了異常。因?yàn)楫?dāng)執(zhí)行b的時(shí)候上下文仍然是window,這是因?yàn)榧^函數(shù)已經(jīng)綁定了window做為上下文。
解決辦法就是不要在對(duì)象的方法上使用箭頭函數(shù)短語(yǔ)法,這樣this關(guān)鍵字會(huì)在調(diào)用時(shí)決定,而不是早早綁定在閉合的上下文中。如 obj.d()

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

function Obj(name) {
  this.objName = name;  
}
Obj.prototype.getObjName = () => {
    console.log(this === window);
    // true
    return this.objName;
}

var obj = new Obj("小紅");
obj.getObjName(); 
// undefined

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)的。

在客戶端,在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";
});

以上補(bǔ)充的摘自:翻譯 | ES6 箭頭函數(shù)使用禁忌

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

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

相關(guān)文章

  • 普通函數(shù)箭頭函數(shù)的區(qū)別以及箭頭函數(shù)的注意事項(xiàng)、不適用場(chǎng)景

    摘要:第二種情況是箭頭函數(shù)的如果指向普通函數(shù)它的繼承于該普通函數(shù)。箭頭函數(shù)的指向全局,使用會(huì)報(bào)未聲明的錯(cuò)誤。 showImg(https://segmentfault.com/img/remote/1460000018610072?w=600&h=400); 箭頭函數(shù)是ES6的API,相信很多人都知道,因?yàn)槠湔Z(yǔ)法上相對(duì)于普通函數(shù)更簡(jiǎn)潔,深受大家的喜愛(ài)。就是這種我們?nèi)粘i_(kāi)發(fā)中一直在使用的API...

    paulquei 評(píng)論0 收藏0
  • 普通函數(shù)箭頭函數(shù)

    摘要:我常常的使用箭頭函數(shù),卻還沒(méi)有對(duì)箭頭函數(shù)有個(gè)深入的了解,現(xiàn)在找一下這個(gè)函數(shù)的不同點(diǎn)箭頭函數(shù)本身沒(méi)有原型由于箭頭函數(shù)沒(méi)有原型,因此箭頭函數(shù)本身沒(méi)有箭頭函數(shù)的指向在定義的時(shí)候繼承自外層第一個(gè)普通函數(shù)的的指向的指向的指向的指向從上面例子中可以得出 我常常的使用箭頭函數(shù),卻還沒(méi)有對(duì)箭頭函數(shù)有個(gè)深入的了解,現(xiàn)在找一下這2個(gè)函數(shù)的不同點(diǎn) 1. 箭頭函數(shù)本身沒(méi)有prototype(原型) 由于箭頭函...

    tolerious 評(píng)論0 收藏0
  • ES6精解:箭頭函數(shù)

    摘要:基本用法在中允許使用來(lái)定義函數(shù),如下就等同于從上面可以看出,在箭頭左側(cè)的是代表參數(shù),若參數(shù)只有一個(gè),可以省略,箭頭右側(cè)的表示函數(shù)代碼塊,若代碼塊里面是個(gè)返回值,則可以省略不寫(xiě)無(wú)參數(shù)情況若箭頭函數(shù)不需要參數(shù),則左側(cè)用代替,如下無(wú)參數(shù)情況無(wú)參數(shù) 基本用法 在ES6中允許使用 => 來(lái)定義函數(shù),如下: var f = a => a; console.log(f(1)); //1 就...

    HackerShell 評(píng)論0 收藏0
  • es6 - 箭頭函數(shù)

    摘要:也就是說(shuō)箭頭函數(shù)的的值不再根據(jù)調(diào)用時(shí)上下文確定,而是像普通變量那樣根據(jù)定義時(shí)的作用域鏈進(jìn)行查找。箭頭函數(shù)中的依然要根據(jù)定義時(shí)的作用域鏈進(jìn)行查找。知乎這篇文章對(duì)箭頭函數(shù)的一些不適合的場(chǎng)景進(jìn)行了總結(jié),可以作為參考。 es6 - 箭頭函數(shù) 哇,箭頭函數(shù)...,聽(tīng)起來(lái)好NB,但是如果你知道它是因?yàn)槭褂昧?>這樣類似箭頭的符號(hào) ,所以才叫箭頭函數(shù)。 瞬間感覺(jué):呵,這名字起的...。 es6增加了...

    13651657101 評(píng)論0 收藏0
  • 箭頭函數(shù)普通函數(shù)的區(qū)別及示例

    摘要:箭頭函數(shù)是前端面試環(huán)節(jié)的一個(gè)高頻考點(diǎn),一般會(huì)問(wèn)箭頭函數(shù)的是指如何用普通函數(shù)實(shí)現(xiàn)一個(gè)箭頭函數(shù)箭頭函數(shù)有哪些優(yōu)點(diǎn)帶著這些問(wèn)題,小編帶各位上路吧箭頭函數(shù)與普通函數(shù)得區(qū)別普通函數(shù)函數(shù)作為全局函數(shù)被調(diào)用時(shí),指向全局對(duì)象函數(shù)作為對(duì)象中的方法被調(diào)用時(shí),指 箭頭函數(shù)是前端面試環(huán)節(jié)的一個(gè)高頻考點(diǎn),一般會(huì)問(wèn) 1、箭頭函數(shù)的this是指?2、如何用普通函數(shù)實(shí)現(xiàn)一個(gè)箭頭函數(shù)3、箭頭函數(shù)有哪些優(yōu)點(diǎn) 帶著這些問(wèn)題...

    Backache 評(píng)論0 收藏0
  • ES6 - 箭頭函數(shù)、箭頭函數(shù)普通函數(shù)的區(qū)別總結(jié)

    摘要:但是因?yàn)榧^函數(shù)沒(méi)有自己的,它的其實(shí)是繼承了外層執(zhí)行環(huán)境中的,且指向永遠(yuǎn)不會(huì)隨在哪里調(diào)用被誰(shuí)調(diào)用而改變,所以箭頭函數(shù)不能作為構(gòu)造函數(shù)使用,或者說(shuō)構(gòu)造函數(shù)不能定義成箭頭函數(shù),否則用調(diào)用時(shí)會(huì)報(bào)錯(cuò)報(bào)錯(cuò)箭頭函數(shù)沒(méi)有自己的箭頭函數(shù)沒(méi)有自己的對(duì)象。 這篇文章我們來(lái)了解一下ES6中的箭頭函數(shù)。首先會(huì)介紹一下箭頭函數(shù)的基本語(yǔ)法,因?yàn)榛菊Z(yǔ)法比較好理解,我們用示例做簡(jiǎn)單介紹即可。之后,我們重點(diǎn)來(lái)討論一下...

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

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

0條評(píng)論

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