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

資訊專欄INFORMATION COLUMN

es6箭頭函數(shù)

UnixAgain / 1826人閱讀

摘要:但是箭頭函數(shù)并沒有自己的其是繼承了外層執(zhí)行環(huán)境的,且不能改變,因此不能作為構(gòu)造函數(shù),此時,引擎會在報錯。不能作為事件的回調(diào)在中,事件的回調(diào)函數(shù)中,會動態(tài)的指向監(jiān)聽的對象,但是由于監(jiān)聽是一個全局函數(shù),所以箭頭函數(shù)的回調(diào)中指向。

箭頭函數(shù)

es6中添加了函數(shù)新的定義語法——箭頭函數(shù),當(dāng)有大于一個形參的時候,必須使用()代表部分參數(shù),函數(shù)體大于一行時,必須使用{}將函數(shù)體括起來,并使用return返回。

箭頭函數(shù)不會創(chuàng)建自己的this

箭頭函數(shù)會在自己的作用域鏈上的上一層尋找this。所以箭頭函數(shù)會在定義時找到自己外層的this,并繼承這個this的值。在后面的任何操作中,this的值都不會改變。
箭頭函數(shù)的實現(xiàn)

var a =  1;
function func() {
    setTimeout(() => {
        console.log(this.a);
    }, 1000);
}
func.call({a: 2});
// 2

setTimeout使用的是箭頭函數(shù),所以this在定義的時候就確定了,繼為外層func的this的值。在函數(shù)執(zhí)行的時候,通過call改變了func的this指向{a:2},所以箭頭函數(shù)繼承func在執(zhí)行環(huán)境中的指向,所以打印輸出2。

普通函數(shù)的實現(xiàn)

var a =  1;
let func = function () {
    setTimeout(function () 
    {
        console.log(this.a);
    }, 1000);
}
func.call({a: 2});
//1

setTimeout使用的是普通的函數(shù),所以其this指向為函數(shù)運行時的所在的作用域。在1秒之后函數(shù)是在全局作用域中執(zhí)行的,此時this指向window對象,所以輸出為1。

不能定義對象方法
let obj = {
    name: "lisi",
    a: function() 
    {
        console.log(this.name);
    },
    b: () =>{
        console.log(this.name);
        this.a();
    }
}

let name = "zhangsan";
obj.a();
obj.b();

//lisi
//zhangsan
//Uncaught TypeError: this.a is not a function

JS中對象方法的定義方式是在對象上定義一個指向函數(shù)的屬性,當(dāng)方法被調(diào)用的時候,方法內(nèi)的this就會指向方法所屬的對象。所以方法a中的this指向?qū)ο髈bj。但是在obj對象的{}無法形成一個多帶帶的作用域,所以obj是在window作用域中,方法b為箭頭函數(shù),指向上層obj的this === window,所以a方法輸出obj的name屬性,b方法輸出全局name的值。且由于全局作用域上沒有a方法,所以this.a()執(zhí)行報錯。所以用箭頭函數(shù)定義對象方法時,不會有預(yù)想的輸出。當(dāng)要定義對象方法時,請使用函數(shù)表達(dá)式或者方法簡寫(es6)。

箭頭函數(shù)不能當(dāng)作構(gòu)造函數(shù)
function Person (name, age) {
     this.age = age;
     this.name = name;
}
let person = new Person("lisi", 23);
console.log(person.name, person.age);
//lisi 23

js在new 生成一個新的實例對象的時候,首先在內(nèi)部生成一個新的空對象,然后將this指向該對象,接著執(zhí)行構(gòu)造函數(shù)的指令,最后將該對象作為實例返回。

let Person = (name, age) => {
    this.name = name;
    this.age = age;
}
let person = new Person("lisi", 23);
console.log(person.name, person.age);
//Uncaught TypeError: Person is not a constructor

但是箭頭函數(shù)并沒有自己的this,其this是繼承了外層執(zhí)行環(huán)境的this,且不能改變,因此不能作為構(gòu)造函數(shù),此時,js引擎會在報錯。Person不是一個構(gòu)造函數(shù)。

this的指向改變

箭頭函數(shù)this的指向不會因為call()、bind()、apply()而改變

var a = "haha"
let func = () =>{
    console.log(this.a)
}
func();
func.bind({a: 1})()
func.apply({a: 2});
func.call({a: 3});
//haha
//haha
//haha
//haha

在js中,可以使用bind()、apply()、call()來動態(tài)綁定函數(shù)的作用域,但是在箭頭函數(shù)中,this由于已經(jīng)固化在上層作用域鏈上,所以這三種方法不能改變this的指向,且不報錯。

箭頭函數(shù)不能使用arguments、super、new.target
function foo() {
  setTimeout(() => {
    console.log("args:", arguments);
  }, 100);
}

foo(2, 4, 6, 8)
// args: [2, 4, 6, 8]

由于定時器的回調(diào)函數(shù)是一個箭頭函數(shù),所以其this指向上一層的foo函數(shù)的環(huán)境中的值。

在es6中可以使用rest參數(shù)代替arguments來訪問函數(shù)的參數(shù)列表

let func = (...args) => {
    console.log(args);
}

func(1, 2, 3, 4, 5);
//[1,2,3,4,5]
沒有原型

由于箭頭函數(shù)沒有自己的this,,所以箭頭函數(shù)沒有自己的原型。

let sayHi = () => {
    console.log("Hello World !")
};
console.log(sayHi.prototype); // undefined
不能作為事件的回調(diào)

在js中,事件的回調(diào)函數(shù)中,this會動態(tài)的指向監(jiān)聽的對象,但是由于監(jiān)聽是一個全局函數(shù),所以箭頭函數(shù)的回調(diào)中this指向window。

var button = document.getElementById("press");
button.addEventListener("click", () => {
  this.innerHtml = "hello"
});

在全局上下文下定義的箭頭函數(shù)執(zhí)行時 this 會指向 window,當(dāng)單擊事件發(fā)生時,瀏覽器會嘗試用 button 作為上下文來執(zhí)行事件回調(diào)函數(shù),但是箭頭函數(shù)預(yù)定義的上下文是不能被修改的,這樣 this.innerHTML 就等價于 window.innerHTML,而后者是沒有任何意義的。

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

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

相關(guān)文章

  • es6 - 箭頭函數(shù)

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

    13651657101 評論0 收藏0
  • ES6學(xué)習(xí)筆記之箭頭函數(shù)

    摘要:特性介紹箭頭函數(shù)是新增的特性之一,它為這門語言提供了一種全新的書寫函數(shù)的語法。用生成的函數(shù)會定義一個自己的,而箭頭函數(shù)沒有自己的,而是會和上一層的作用域共享。 本文同步自我得博客:http://www.joeray61.com JS中的箭頭 箭頭在JS里并不算是個新鮮的玩意兒,一直以來,JS都支持-->這樣的箭頭。 很早的時候有些瀏覽器還不支持JS,當(dāng)時的人們?yōu)榱思嫒葸@些瀏覽器,需要這...

    Vultr 評論0 收藏0
  • 深入ES6箭頭函數(shù)

    摘要:令人震驚的箭頭函數(shù)引入了寫入函數(shù)的新語法。使用箭頭函數(shù)創(chuàng)建簡單對象時有一個警告。代碼因此被默默地解釋為一個不執(zhí)行任何操作并返回未定義的箭頭函數(shù)。內(nèi)部函數(shù)是一個箭頭函數(shù),所以它從封閉范圍繼承此函數(shù)。 箭頭從一開始就一直是JavaScript的一部分。第一個JavaScript教程建議在HTML注釋中包裝內(nèi)聯(lián)腳本。這會阻止不支持JS的瀏覽器錯誤地將JS代碼顯示為文本。你會寫這樣的東西: ...

    MasonEast 評論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ù)的注意點箭頭函數(shù)在參數(shù)和箭頭之間不能換行。值得注意的一點就是對象的指向是可變的,但在箭頭函數(shù)內(nèi)是固定的。 箭頭函數(shù) 1. 簡單的定義: 胖箭頭函數(shù) Fat arrow functions,又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,...

    Faremax 評論0 收藏0
  • 關(guān)于ES6箭頭函數(shù)的this問題

    摘要:對象的指向是可變的,但是在箭頭函數(shù)中,它是固定的。同樣的由于箭頭函數(shù)沒有自己的所以傳統(tǒng)的顯性綁定無效內(nèi)部的指向外部在的學(xué)習(xí)中,的指向問題一直是個難點,特別是在對象方法中使用時,必須更加小心。由此箭頭函數(shù)在很大程度上減少了我們的困擾。 什么是箭頭函數(shù) 用法 ES6 允許使用箭頭(=>)定義函數(shù) 測試 var p1 = document.getElementById(test1)...

    LeviDing 評論0 收藏0

發(fā)表評論

0條評論

UnixAgain

|高級講師

TA的文章

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