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

資訊專欄INFORMATION COLUMN

ES6—箭頭函數(shù)(5)

yanwei / 2379人閱讀

摘要:因?yàn)樗划a(chǎn)生屬于它自己上下文的箭頭函數(shù)的另一個(gè)用處是簡(jiǎn)化回調(diào)函數(shù)。箭頭函數(shù)使用場(chǎng)景箭頭函數(shù)適合于無復(fù)雜邏輯或者無副作用的純函數(shù)場(chǎng)景下,例如用在的回調(diào)函數(shù)定義中,另外目前等庫(kù),都大量使用箭頭函數(shù),直接定義的情況已經(jīng)很少了。

0.為什么會(huì)出現(xiàn)箭頭函數(shù)?

1.傳統(tǒng)的javascript函數(shù)語法并沒有提供任何的靈活性,每一次你需要定義一個(gè)函數(shù)時(shí),你都必須輸入function () {},這至少會(huì)出現(xiàn)兩個(gè)問題,ES6箭頭函數(shù)都圓滿解決了它,

第一個(gè)問題:代碼輸入快了容易輸錯(cuò)成 funciton或者functoin或者其它,但是=>這個(gè)玩意你要是再寫錯(cuò)就只能說有點(diǎn)過分了。

第二個(gè)問題:節(jié)省大量代碼,我們先不用管下面的ES6代碼為什么這樣的語法能實(shí)現(xiàn)同樣的功能,我們就直觀的感受一下代碼量。

ES5寫法:

function addFive(num){
      return num+5;  
}
alert(addFive(10));

ES6寫法:

var addFive = num=>num+5;
alert(addFive(5));

沒有function、沒有return,沒有(),沒有{},這些全變成了浮云,世界好清靜。

從上面我們就可以看到,使用箭頭函數(shù)不僅僅能夠避免錯(cuò)誤,同時(shí)還能讓我們少一丟丟代碼,當(dāng)然實(shí)際工作中遠(yuǎn)比這個(gè)代碼量節(jié)省更多。
一方面是因?yàn)榉e累效應(yīng),每一部分少一丟丟合起來就多了,一方面是它還有更能節(jié)省代碼和大幅提高工作效率的場(chǎng)景。

接下來我們就說說今天的主角--箭頭函數(shù)。

ES6標(biāo)準(zhǔn)新增了一種新的函數(shù):Arrow Function(箭頭函數(shù)),也稱“胖箭頭函數(shù)”, 允許

使用“箭頭”(=>)定義函數(shù),是一種簡(jiǎn)寫的函數(shù)表達(dá)式。

1、箭頭函數(shù)語法

在ES5中我們實(shí)現(xiàn)一個(gè)求和的函數(shù):

var sum = function(x, y) {
    return x + y
}

要使用箭頭函數(shù),可以分兩步實(shí)現(xiàn)同樣的函數(shù)功能:

首先使用=>來替代關(guān)鍵詞function

var sum = (x, y) => {
    return x + y
}

這個(gè)特性非常好!??!

前面我們已經(jīng)說過用=>來替代關(guān)鍵詞function就意味著不會(huì)寫錯(cuò)function了,這真是一個(gè)絕妙的設(shè)計(jì)思想!

其次,函數(shù)體只有一條返回語句時(shí), 我們可以省略括號(hào){}和return關(guān)鍵詞:

var sum = (x, y) => x + y

再夸張一點(diǎn)點(diǎn),如果只有一個(gè)參數(shù)時(shí),()可省略。

這是箭頭函數(shù)最簡(jiǎn)潔的形式,常用于作用簡(jiǎn)單的處理函數(shù),比如過濾:

// ES5
var array = ["1", "2345", "567", "89"];
array = array.filter(function (item) {
    return item.length > 2;
});
//?["2345", "567"]


// ES6
let array = ["1", "2345", "567", "89"];
array = array.filter(item => item.length > 2); 
// ["2345", "567"]

箭頭函數(shù)的主要使用模式如下:

//  一個(gè)參數(shù)對(duì)應(yīng)一個(gè)表達(dá)式
param => expression;// 例如 x => x+2;

// 多個(gè)參數(shù)對(duì)應(yīng)一個(gè)表達(dá)式
(param [, param]) => expression; //例如 (x,y) => (x + y);

// 一個(gè)參數(shù)對(duì)應(yīng)多個(gè)表示式
param => {statements;} //例如 x = > { x++; return x;};

//  多個(gè)參數(shù)對(duì)應(yīng)多個(gè)表達(dá)式
([param] [, param]) => {statements} // 例如 (x,y) => { x++;y++;return x*y;};

//表達(dá)式里沒有參數(shù)
() => expression; //例如var flag = (() => 2)(); flag等于2

() => {statements;} //例如 var flag = (() => {return 1;})(); flag就等于1

 //傳入一個(gè)表達(dá)式,返回一個(gè)對(duì)象
([param]) => ({ key: value });
//例如  var fuc = (x) => ({key:x})
        var object = fuc(1);
        alert(object);//{key:1}

大家不要覺得好多啊,好麻煩,其實(shí)這些根本不復(fù)雜。投入一次,受益終生。(怎么感覺我像賣保險(xiǎn)的……),寫一兩次你就習(xí)慣新的寫法了。

2、箭頭函數(shù)中的 this

箭頭函數(shù)內(nèi)的this值繼承自外圍作用域。運(yùn)行時(shí)它會(huì)首先到它的父作用域找,如果父作用域還是箭頭函數(shù),那么接著向上找,直到找到我們要的this指向。

我們先看一道經(jīng)典的關(guān)于this的面試題:

var name = "leo";
var teacher = {
    name: "大彬哥",
    showName: function () {
        function showTest() {
            alert(this.name);
        }
        showTest();
    }
};
teacher.showName();//結(jié)果是 leo,而我們期待的是大彬哥,這里this指向了window,我們期待指向teacher

大家知道,ES5中的this說好聽了叫"靈活",說不好聽就是瞎搞,特別容易出問題.而且面試還非常愛考,工作更不用說了,經(jīng)常給我們開發(fā)搗亂,出現(xiàn)不好調(diào)試的bug,用E箭頭函數(shù)解決這個(gè)問題就很得心應(yīng)手了。

var name = "leo";
var teacher = {
    name: "大彬哥",
    showName: function () {
        let showTest = ()=>alert(this.name);
        showTest();
    }
};
teacher.showName();

箭頭函數(shù)中的this其實(shí)是父級(jí)作用域中的this。箭頭函數(shù)引用了父級(jí)的變量詞法作用域就是一個(gè)變量的作用在定義的時(shí)候就已經(jīng)被定義好,當(dāng)在本作用域中找不到變量,就會(huì)一直向父作用域中查找,直到找到為止。

由于this在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以,用call或者apply調(diào)用箭頭函數(shù)時(shí),無法對(duì)this進(jìn)行綁定,即傳入的第一個(gè)參數(shù)被忽略:

var obj = {
    birth: 1996,
    getAge: function (year) {
        var b = this.birth; // 1996
        var fn = (y) => y - this.birth; // this.birth仍是1996
        return fn.call({birth:1990}, year);
    }
};
obj.getAge(2018); // 22 ( 2018 - 1996)

由于this已經(jīng)在詞法層面完成了綁定,通過call或apply方法調(diào)用一個(gè)函數(shù)時(shí),只是傳入了參數(shù)而已,對(duì)this并沒有什么影響 。因此,這個(gè)設(shè)計(jì)節(jié)省了開發(fā)者思考上下文綁定的時(shí)間。

3、箭頭函數(shù)的特性

3.1 箭頭函數(shù)沒有 arguments

箭頭函數(shù)不僅沒有this,常用的arguments也沒有。如果你能獲取到arguments,那它

一定是來自父作用域的。

function foo() {
  return () => console.log(arguments)
}

foo(1, 2)(3, 4)  // 1,2

上例中如果箭頭函數(shù)有arguments,就應(yīng)該輸出的是3,4而不是1,2。

箭頭函數(shù)不綁定arguments,取而代之用rest參數(shù)…解決

var foo = (...args) => {
  return args
}

console.log(foo(1,3,56,36,634,6))    // [1, 3, 56, 36, 634, 6]

箭頭函數(shù)要實(shí)現(xiàn)類似純函數(shù)的效果,必須剔除外部狀態(tài)。我們可以看出,箭頭函數(shù)除了傳入的參數(shù)之外,真的在普通函數(shù)里常見的this、arguments、caller是統(tǒng)統(tǒng)沒有的!

如果你在箭頭函數(shù)引用了this、arguments或者參數(shù)之外的變量,那它們一定不是箭頭函數(shù)本身包含的,而是從父級(jí)作用域繼承的。

3.2 箭頭函數(shù)中不能使用 new

let Person = (name) => {
    this.name = name;
};
let one = new Person("galler");

運(yùn)行該程序,則出現(xiàn)TypeError: Person is not a constructor

3.3 箭頭函數(shù)可以與變量解構(gòu)結(jié)合使用。

const full = ({ first, last }) => first + " " + last;

// 等同于
function full(person) {
  return person.first + " " + person.last;
}

 full({first: 1, last: 5}) // "1 5"

3.4 箭頭函數(shù)沒有原型屬性

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

由此可以看出箭頭函數(shù)沒有原型。

另一個(gè)錯(cuò)誤是在原型上使用箭頭函數(shù),如:

function A() {
  this.foo = 1
}

A.prototype.bar = () => console.log(this.foo)

let a = new A()
a.bar()  //undefined

同樣,箭頭函數(shù)中的this不是指向A,而是根據(jù)變量查找規(guī)則回溯到了全局作用域。同樣,使用普通函數(shù)就不存在問題。箭頭函數(shù)中不可加new,也就是說箭頭函數(shù)不能當(dāng)構(gòu)造函數(shù)進(jìn)行使用。

3.5 箭頭函數(shù)不能換行

var func = ()
           => 1; // SyntaxError: expected expression, got "=>"

如果開發(fā)中確實(shí)一行搞不定,邏輯很多,就加{},你就想怎么換行怎么換行了。

var func = ()=>{
    return "來??!互相傷害啊!"; // 1.加{} 2.加return
}

4、箭頭函數(shù)使用場(chǎng)景

JavaScript中this的故事已經(jīng)是非常古老了,每一個(gè)函數(shù)都有自己的上下文。

以下例子的目的是使用jQuery來展示一個(gè)每秒都會(huì)更新的時(shí)鐘:

$(".time").each(function () {
  setInterval(function () {
    $(this).text(Date.now());
  }, 1000);
});

當(dāng)嘗試在setInterval的回調(diào)中使用this來引用DOM元素時(shí),很不幸,我們得到的只是一個(gè)屬于回調(diào)函數(shù)自身

上下文的this。一個(gè)通常的解決辦法是定義一個(gè)that或者self變量:

$(".time").each(function () {
  var self = this;
  setInterval(function () {
    $(self).text(Date.now());
  }, 1000);
});

但當(dāng)使用箭頭函數(shù)時(shí),這個(gè)問題就不復(fù)存在了。因?yàn)樗划a(chǎn)生屬于它自己上下文的this:

$(".time").each(function () {
  setInterval(() => $(this).text(Date.now()), 1000);
});

箭頭函數(shù)的另一個(gè)用處是簡(jiǎn)化回調(diào)函數(shù)。

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

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

當(dāng)然也可以在事件監(jiān)聽函數(shù)里使用:

document.body.addEventListener("click", event=>console.log(event, this)); 
// EventObject, BodyElement

5、總結(jié)

5.1 箭頭函數(shù)優(yōu)點(diǎn)

箭頭函數(shù)是使用=>語法的函數(shù)簡(jiǎn)寫形式。這在語法上與 C#、Java 8 、Python( lambda 函數(shù))和 CoffeeScript 的

相關(guān)特性非常相似。

非常簡(jiǎn)潔的語法,使用箭頭函數(shù)比普通函數(shù)少些動(dòng)詞,如:function或return。

() => { ... } // 零個(gè)參數(shù)用 () 表示。

x => { ... } // 一個(gè)參數(shù)可以省略 ()。

(x, y) => { ... } // 多參數(shù)不能省略 ()。

如果只有一個(gè)return,{}可以省略。

更直觀的作用域和 this的綁定,它能讓我們能很好的處理this的指向問題。箭頭函數(shù)加上let關(guān)鍵字的使用,將會(huì)讓我們javascript代碼上一個(gè)層次。

5.2 箭頭函數(shù)使用場(chǎng)景

箭頭函數(shù)適合于無復(fù)雜邏輯或者無副作用的純函數(shù)場(chǎng)景下,例如用在map、reduce、filter的回調(diào)函數(shù)定義

中,另外目前vue、react、node等庫(kù),都大量使用箭頭函數(shù),直接定義function的情況已經(jīng)很少了。

各位同學(xué)在寫新項(xiàng)目的時(shí)候,要不斷的琢磨箭頭函數(shù)使用場(chǎng)景、特點(diǎn),享受使用箭頭函數(shù)帶來的便利,這樣才能更快地成長(zhǎng)。

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

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

相關(guān)文章

  • ES6系列】函數(shù)部分

    摘要:正是因?yàn)樗鼪]有,所以也就不能用作構(gòu)造函數(shù)。不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會(huì)拋出一個(gè)錯(cuò)誤。不可以使用對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在。 箭頭函數(shù) 在之前ES5的版本中,我們定義一個(gè)函數(shù)的形式如下: function a() { // do something…… } 但是在ES6中,則新增了箭頭函數(shù)的方式,ES6中允許使用箭頭(=>)來定義函數(shù)。 () => { ...

    enda 評(píng)論0 收藏0
  • 「前端面試題系列5ES6箭頭函數(shù)的用法

    摘要:在這里,如果用箭頭函數(shù),可以這樣改寫箭頭函數(shù)并沒有自己的,所以事件處理函數(shù)的調(diào)用者并不受影響。比如,在需要?jiǎng)討B(tài)上下文的場(chǎng)景中,使用箭頭函數(shù)需要格外地小心,這些場(chǎng)景包括對(duì)象的方法原型方法事件的回調(diào)構(gòu)造函數(shù)。 showImg(https://segmentfault.com/img/bVboce6?w=1304&h=734); 前言 年味兒漸散,收拾下心情,繼續(xù)敲代碼吧。 對(duì)于即將到來金三...

    betacat 評(píng)論0 收藏0
  • ES6學(xué)習(xí)總結(jié)(二)

    摘要:關(guān)于的學(xué)習(xí)總結(jié)昨天寫了第一篇,主要是關(guān)于變量聲明關(guān)鍵字和,新增類型以及模板字符串,今天準(zhǔn)備寫第二篇,里面的函數(shù)部分,新增了箭頭函數(shù),參數(shù)以及參數(shù)默認(rèn)值。,這次我們?cè)谡{(diào)用函數(shù)大的時(shí)候,兩個(gè)參數(shù)全部傳遞了值,因此返回。 關(guān)于ES6的學(xué)習(xí)總結(jié),昨天寫了第一篇,主要是關(guān)于變量聲明關(guān)鍵字let和const,新增類型Symbol以及模板字符串,今天準(zhǔn)備寫第二篇,ES6里面的函數(shù)部分,ES6新增了箭...

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

    摘要:但是箭頭函數(shù)并沒有自己的其是繼承了外層執(zhí)行環(huán)境的,且不能改變,因此不能作為構(gòu)造函數(shù),此時(shí),引擎會(huì)在報(bào)錯(cuò)。不能作為事件的回調(diào)在中,事件的回調(diào)函數(shù)中,會(huì)動(dòng)態(tài)的指向監(jiān)聽的對(duì)象,但是由于監(jiān)聽是一個(gè)全局函數(shù),所以箭頭函數(shù)的回調(diào)中指向。 箭頭函數(shù) es6中添加了函數(shù)新的定義語法——箭頭函數(shù),當(dāng)有大于一個(gè)形參的時(shí)候,必須使用()代表部分參數(shù),函數(shù)體大于一行時(shí),必須使用{}將函數(shù)體括起來,并使用ret...

    UnixAgain 評(píng)論0 收藏0
  • ES6箭頭函數(shù)體中this指向哪里?

    摘要:注意因?yàn)榧^函數(shù)內(nèi)部的是指向外層代碼塊的最近的,例中的函數(shù)的,所以我們可以通過改變外層代碼塊的的指向從而改變箭頭函數(shù)中的指向例中使用了函數(shù)的方法。 一、this關(guān)鍵字小測(cè)試 ES6箭頭函數(shù)體中的this指向哪里? 在回答這個(gè)問題之前先來揣揣你對(duì)this關(guān)鍵字的了解程度:(讓我們回到ES6之前)題: var obj = { a: function() { cons...

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

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

0條評(píng)論

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