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

資訊專欄INFORMATION COLUMN

ES6 - 箭頭函數(shù)、箭頭函數(shù)與普通函數(shù)的區(qū)別總結(jié)

scola666 / 2327人閱讀

摘要:但是因?yàn)榧^函數(shù)沒有自己的,它的其實(shí)是繼承了外層執(zhí)行環(huán)境中的,且指向永遠(yuǎn)不會隨在哪里調(diào)用被誰調(diào)用而改變,所以箭頭函數(shù)不能作為構(gòu)造函數(shù)使用,或者說構(gòu)造函數(shù)不能定義成箭頭函數(shù),否則用調(diào)用時會報錯報錯箭頭函數(shù)沒有自己的箭頭函數(shù)沒有自己的對象。

這篇文章我們來了解一下ES6中的箭頭函數(shù)。首先會介紹一下箭頭函數(shù)的基本語法,因?yàn)榛菊Z法比較好理解,我們用示例做簡單介紹即可。之后,我們重點(diǎn)來討論一下箭頭函數(shù)與普通函數(shù)之間的區(qū)別。

本文已同步至我的個人主頁。歡迎訪問查看更多內(nèi)容!如有錯誤或遺漏,歡迎隨時指正探討!謝謝大家的關(guān)注與支持!

一、基本語法

ES6中允許使用箭頭=>來定義箭頭函數(shù),具體語法,我們來看一個簡單的例子:

// 箭頭函數(shù)
let fun = (name) => {
    // 函數(shù)體
    return `Hello ${name} !`;
};

// 等同于
let fun = function (name) {
    // 函數(shù)體
    return `Hello ${name} !`;
};

可以看出,定義箭頭函在數(shù)語法上要比普通函數(shù)簡潔得多。箭頭函數(shù)省去了function關(guān)鍵字,采用箭頭=>來定義函數(shù)。函數(shù)的參數(shù)放在=>前面的括號中,函數(shù)體跟在=>后的花括號中。

關(guān)于箭頭函數(shù)的參數(shù):
如果箭頭函數(shù)沒有參數(shù),直接寫一個空括號即可。
如果箭頭函數(shù)的參數(shù)只有一個,也可以省去包裹參數(shù)的括號。
如果箭頭函數(shù)有多個參數(shù),將參數(shù)依次用逗號(,)分隔,包裹在括號中即可。

// 沒有參數(shù)
let fun1 = () => {
    console.log(111);
};

// 只有一個參數(shù),可以省去參數(shù)括號
let fun2 = name => {
    console.log(`Hello ${name} !`)
};

// 有多個參數(shù)
let fun3 = (val1, val2, val3) => {
    return [val1, val2, val3];
};

關(guān)于箭頭函數(shù)的函數(shù)體:
如果箭頭函數(shù)的函數(shù)體只有一句代碼,就是簡單返回某個變量或者返回一個簡單的JS表達(dá)式,可以省去函數(shù)體的大括號{ }。

let f = val => val;
// 等同于
let f = function (val) { return val };

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

如果箭頭函數(shù)的函數(shù)體只有一句代碼,就是返回一個對象,可以像下面這樣寫:

// 用小括號包裹要返回的對象,不報錯
let getTempItem = id => ({ id: id, name: "Temp" });

// 但絕不能這樣寫,會報錯。
// 因?yàn)閷ο蟮拇罄ㄌ枙唤忉尀楹瘮?shù)體的大括號
let getTempItem = id => { id: id, name: "Temp" };

如果箭頭函數(shù)的函數(shù)體只有一條語句并且不需要返回值(最常見是調(diào)用一個函數(shù)),可以給這條語句前面加一個void關(guān)鍵字

let fn = () => void doesNotReturn();

箭頭函數(shù)最常見的用處就是簡化回調(diào)函數(shù)。

// 例子一
// 正常函數(shù)寫法
[1,2,3].map(function (x) {
  return x * x;
});

// 箭頭函數(shù)寫法
[1,2,3].map(x => x * x);

// 例子二
// 正常函數(shù)寫法
var result = [2, 5, 1, 4, 3].sort(function (a, b) {
  return a - b;
});

// 箭頭函數(shù)寫法
var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);
二、箭頭函數(shù)與普通函數(shù)的區(qū)別 1、語法更加簡潔、清晰

從上面的基本語法示例中可以看出,箭頭函數(shù)的定義要比普通函數(shù)定義簡潔、清晰得多,很快捷。

2、箭頭函數(shù)不會創(chuàng)建自己的this(重要!!深入理解!!)

我們先來看看MDN上對箭頭函數(shù)this的解釋。

箭頭函數(shù)不會創(chuàng)建自己的this,所以它沒有自己的this,它只會從自己的作用域鏈的上一層繼承this

箭頭函數(shù)沒有自己的this,它會捕獲自己在定義時(注意,是定義時,不是調(diào)用時)所處的外層執(zhí)行環(huán)境的this,并繼承這個this值。所以,箭頭函數(shù)中this的指向在它被定義的時候就已經(jīng)確定了,之后永遠(yuǎn)不會改變。

來看個例子:

var id = "Global";

function fun1() {
    // setTimeout中使用普通函數(shù)
    setTimeout(function(){
        console.log(this.id);
    }, 2000);
}

function fun2() {
    // setTimeout中使用箭頭函數(shù)
    setTimeout(() => {
        console.log(this.id);
    }, 2000)
}

fun1.call({id: "Obj"});     // "Global"

fun2.call({id: "Obj"});     // "Obj"

上面這個例子,函數(shù)fun1中的setTimeout中使用普通函數(shù),2秒后函數(shù)執(zhí)行時,這時函數(shù)其實(shí)是在全局作用域執(zhí)行的,所以this指向Window對象,this.id就指向全局變量id,所以輸出"Global"
但是函數(shù)fun2中的setTimeout中使用的是箭頭函數(shù),這個箭頭函數(shù)的this在定義時就確定了,它繼承了它外層fun2的執(zhí)行環(huán)境中的this,而fun2調(diào)用時thiscall方法改變到了對象{id: "Obj"}中,所以輸出"Obj"

再來看另一個例子:

var id = "GLOBAL";
var obj = {
  id: "OBJ",
  a: function(){
    console.log(this.id);
  },
  b: () => {
      console.log(this.id);
  }
};

obj.a();    // "OBJ"
obj.b();    // "GLOBAL"

上面這個例子,對象obj的方法a使用普通函數(shù)定義的,普通函數(shù)作為對象的方法調(diào)用時,this指向它所屬的對象。所以,this.id就是obj.id,所以輸出"OBJ"
但是方法b是使用箭頭函數(shù)定義的,箭頭函數(shù)中的this實(shí)際是繼承的它定義時所處的全局執(zhí)行環(huán)境中的this,所以指向Window對象,所以輸出"GLOBAL"。(這里要注意,定義對象的大括號{}是無法形成一個多帶帶的執(zhí)行環(huán)境的,它依舊是處于全局執(zhí)行環(huán)境中!!

3、箭頭函數(shù)繼承而來的this指向永遠(yuǎn)不變(重要!!深入理解!!)

上面的例子,就完全可以說明箭頭函數(shù)繼承而來的this指向永遠(yuǎn)不變。對象obj的方法b是使用箭頭函數(shù)定義的,這個函數(shù)中的this永遠(yuǎn)指向它定義時所處的全局執(zhí)行環(huán)境中的this,即便這個函數(shù)是作為對象obj的方法調(diào)用,this依舊指向Window對象。

4、.call()/.apply()/.bind()無法改變箭頭函數(shù)中this的指向

.call()/.apply()/.bind()方法可以用來動態(tài)修改函數(shù)執(zhí)行時this的指向,但由于箭頭函數(shù)的this定義時就已經(jīng)確定且永遠(yuǎn)不會改變。所以使用這些方法永遠(yuǎn)也改變不了箭頭函數(shù)this的指向,雖然這么做代碼不會報錯。

var id = "Global";
// 箭頭函數(shù)定義在全局作用域
let fun1 = () => {
    console.log(this.id)
};

fun1();     // "Global"
// this的指向不會改變,永遠(yuǎn)指向Window對象
fun1.call({id: "Obj"});     // "Global"
fun1.apply({id: "Obj"});    // "Global"
fun1.bind({id: "Obj"})();   // "Global"
5、箭頭函數(shù)不能作為構(gòu)造函數(shù)使用

我們先了解一下構(gòu)造函數(shù)的new都做了些什么?簡單來說,分為四步:
① JS內(nèi)部首先會先生成一個對象;
② 再把函數(shù)中的this指向該對象;
③ 然后執(zhí)行構(gòu)造函數(shù)中的語句;
④ 最終返回該對象實(shí)例。

但是!!因?yàn)榧^函數(shù)沒有自己的this,它的this其實(shí)是繼承了外層執(zhí)行環(huán)境中的this,且this指向永遠(yuǎn)不會隨在哪里調(diào)用、被誰調(diào)用而改變,所以箭頭函數(shù)不能作為構(gòu)造函數(shù)使用,或者說構(gòu)造函數(shù)不能定義成箭頭函數(shù),否則用new調(diào)用時會報錯!

let Fun = (name, age) => {
    this.name = name;
    this.age = age;
};

// 報錯
let p = new Fun("cao", 24);
6、箭頭函數(shù)沒有自己的arguments

箭頭函數(shù)沒有自己的arguments對象。在箭頭函數(shù)中訪問arguments實(shí)際上獲得的是外層局部(函數(shù))執(zhí)行環(huán)境中的值。

// 例子一
let fun = (val) => {
    console.log(val);   // 111
    // 下面一行會報錯
    // Uncaught ReferenceError: arguments is not defined
    // 因?yàn)橥鈱尤汁h(huán)境沒有arguments對象
    console.log(arguments); 
};
fun(111);

// 例子二
function outer(val1, val2) {
    let argOut = arguments;
    console.log(argOut);    // ①
    let fun = () => {
        let argIn = arguments;
        console.log(argIn);     // ②
        console.log(argOut === argIn);  // ③
    };
    fun();
}
outer(111, 222);

上面例子二,①②③處的輸出結(jié)果如下:

很明顯,普通函數(shù)outer內(nèi)部的箭頭函數(shù)fun中的arguments對象,其實(shí)是沿作用域鏈向上訪問的外層outer函數(shù)的arguments對象。

可以在箭頭函數(shù)中使用rest參數(shù)代替arguments對象,來訪問箭頭函數(shù)的參數(shù)列表!!

7、箭頭函數(shù)沒有原型prototype
let sayHi = () => {
    console.log("Hello World !")
};
console.log(sayHi.prototype); // undefined
8、箭頭函數(shù)不能用作Generator函數(shù),不能使用yeild關(guān)鍵字

這一點(diǎn)等到講解Generator函數(shù)的時候我們在深入討論。

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/103132.html

相關(guān)文章

  • ES6精解:箭頭函數(shù)

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

    HackerShell 評論0 收藏0
  • ES6 箭頭函數(shù) 從了解到深入

    摘要:有傳聞?wù)f,箭頭函數(shù)的語法,是受到了的影響,并且它與中的語法一樣,共享上下文。箭頭函數(shù)是新增加的一個特性。箭頭函數(shù)沒有自己的值,其值是通過繼承其它傳入對象而獲得的通常來說是上一級外部函數(shù)的的指向。 箭頭函數(shù) 1. 簡單的定義: 胖箭頭函數(shù) Fat arrow functions,又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,...

    Eminjannn 評論0 收藏0
  • ES6~你跟箭頭函數(shù)升華之路

    摘要:箭頭函數(shù)簡單的定義胖箭頭函數(shù),又稱箭頭函數(shù),是一個來自又稱的全新特性。箭頭函數(shù)是新增加的一個特性。使用箭頭函數(shù)的注意點(diǎn)箭頭函數(shù)在參數(shù)和箭頭之間不能換行。值得注意的一點(diǎn)就是對象的指向是可變的,但在箭頭函數(shù)內(nèi)是固定的。 箭頭函數(shù) 1. 簡單的定義: 胖箭頭函數(shù) Fat arrow functions,又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,...

    Faremax 評論0 收藏0
  • 普通函數(shù)箭頭函數(shù)區(qū)別以及箭頭函數(shù)注意事項(xiàng)、不適用場景

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

    paulquei 評論0 收藏0
  • ES6常用新特性——讀《Understanding ECMAScript 6》總結(jié)

    摘要:對象解構(gòu)對象解構(gòu)語法在賦值語句的左側(cè)使用了對象字面量,例如代碼中,的值被存儲到本地變量中,的值則存儲到變量中。當(dāng)使用解構(gòu)賦值語句時,如果所指定的本地變量在對象中沒有找到同名屬性,那么該變量會被賦值為。 現(xiàn)在ES6在很多項(xiàng)目中大量使用。最近我也花時間看了一下《Understanding ECMAScript6》的中文電子書。在這里總結(jié)了一些在實(shí)際開發(fā)中常用的新特性。 塊級作用域 在ES6...

    jsliang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<