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

資訊專(zhuān)欄INFORMATION COLUMN

從use strict看JS(一):this與箭頭函數(shù)

darcrand / 1425人閱讀

摘要:其次,指向有一個(gè)好處,構(gòu)造函數(shù)一般不要直接運(yùn)行,那要是強(qiáng)行運(yùn)行呢指向會(huì)給添加許多屬性,有擾亂命名空間之嫌,指向之后,你強(qiáng)行運(yùn)行我就強(qiáng)行報(bào)錯(cuò)會(huì)給增加屬性,改成嚴(yán)格模式就會(huì)當(dāng)然,不能解決所有問(wèn)題,所以有了箭頭函數(shù)參考嚴(yán)格模式詳解

上github看原文:點(diǎn)一下

系列

一日,見(jiàn)“use strict”,冥想許久……

系列列表:
從use strict看JS(一):this與箭頭函數(shù)
從use strict看JS(二):函數(shù)傳參模式與arguments

use strict

use strict指js的嚴(yán)格模式,還沒(méi)了解的看這里:Javascript 嚴(yán)格模式詳解

use strict有3點(diǎn)比較重要

函數(shù)調(diào)用this為undefined

arguments。不允許對(duì)arguments賦值。禁止使用arguments.callee。arguments不再追蹤參數(shù)的變化

不用var聲明不會(huì)提升成全局變量,而是報(bào)錯(cuò)

use strict還有一些常人不易寫(xiě)錯(cuò)的,不納入寫(xiě)作范圍:

對(duì)象不能有重名的屬性,函數(shù)不能有重名的參數(shù)

規(guī)定保留字。class, implements

回歸正題,什么是函數(shù)調(diào)用?為何嚴(yán)格模式函數(shù)調(diào)用要將this指向undefined?

this調(diào)用的四種模式

首先牢記:js function有四種方式調(diào)用,每一種的this都不同。

方法調(diào)用

當(dāng)函數(shù)被保存為對(duì)象的屬性時(shí),我們稱(chēng)這個(gè)函數(shù)為方法。方法調(diào)用的this就綁定到該對(duì)象

    var dog={
        name:"doge",
        sayName:function(){
            console.log(this.name);
        }
    }
    //輸出doge,this綁定到了dog
    dog.sayName();
函數(shù)調(diào)用

聲明一個(gè)function然后調(diào)用。非嚴(yán)格模式this指向window,嚴(yán)格模式是undefined

    function sayName(){
        console.log(this);
    }
    function sayNameStrict(){
        "use strict";
        console.log(this);
    }
    //指向window
    sayName();
    //開(kāi)啟嚴(yán)格模式,指向undefined
    sayNameStrict();
構(gòu)造函數(shù)調(diào)用

這在對(duì)象、對(duì)象繼承用的比較多,通過(guò)new來(lái)使用,this指向new出來(lái)的新對(duì)象。
后面會(huì)有文章講解new如何實(shí)現(xiàn),到時(shí)候就會(huì)很清楚。

    function Dog(name){
        this.name=name;
    }
    var dog=new Dog("doge");
    //this指向dog
    console.log(dog.name);
apply & call & bind

這類(lèi)就是改變this,apply和call是很重要的,所以許多面試都會(huì)問(wèn),之后的文章我們會(huì)看到它們的強(qiáng)大作用。

問(wèn)題:當(dāng)對(duì)象的方法返回了函數(shù)?

那就是函數(shù)調(diào)用了。這是js的一個(gè)設(shè)計(jì)錯(cuò)誤,this應(yīng)該綁定到外部函數(shù)的this變量,
這個(gè)錯(cuò)誤即是“函數(shù)調(diào)用”this綁定的錯(cuò)誤。嚴(yán)格模式規(guī)定,this不指向window了,但并沒(méi)有解決這個(gè)問(wèn)題,于是箭頭函數(shù)來(lái)了。

var dog={
    name:"doge",
    sayName:function(){
        return function(){
            console.log(this);
        }
    }
}
// 此時(shí)是函數(shù)調(diào)用,this指向window
dog.sayName()();

箭頭函數(shù)對(duì)this的改變

箭頭函數(shù)怎么解決這個(gè)問(wèn)題呢?其實(shí)用了閉包,改成下面這樣,babel啥的也是這樣做的。

var dog = {
    name: "doge",
    sayName: function sayName() {
        var _this = this;

        return function () {
            console.log(_this);
        };
    }
};

那如果嵌套了多層箭頭函數(shù)?對(duì)閉包來(lái)說(shuō)是一樣的

var dog={
        name:"doge",
        sayName:function(){
            return ()=>{
                return ()=>{
                    console.log(this);
                }
            }
        }
    }

相當(dāng)于

var dog = {
    name: "doge",
    sayName: function sayName() {
        var _this = this;
        return function () {
            return function () {
                console.log(_this);
            };
        };
    }
};

那如果函數(shù)的屬性就是箭頭函數(shù)?沒(méi)有這樣用的!你會(huì)拿到window

    var dog={
        name:"doge",
        sayName:()=>{
            console.log(this);
        }
    }
    // this指向window,因?yàn)榧^函數(shù)
    dog.sayName();
the good parts

這是一本書(shū),文末有鏈接。

the good parts說(shuō)過(guò):js語(yǔ)言有些地方設(shè)計(jì)得不好,于是后來(lái)的標(biāo)準(zhǔn)不斷地補(bǔ)坑。
the good parts又說(shuō)過(guò):js 函數(shù)調(diào)用this綁定到window是一個(gè)設(shè)計(jì)錯(cuò)誤

等等,嚴(yán)格模式函數(shù)調(diào)用this為何指向undefined??

首先,不該指向window,所以換一個(gè)。

其次,指向undefined有一個(gè)好處,構(gòu)造函數(shù)一般不要直接運(yùn)行,那要是強(qiáng)行運(yùn)行呢?this指向window會(huì)給window添加許多屬性,有擾亂命名空間之嫌,指向undefined之后,你強(qiáng)行運(yùn)行我就強(qiáng)行報(bào)錯(cuò)!

function Dog(name){

 this.name=name;

}
//會(huì)給window增加name屬性,改成嚴(yán)格模式就會(huì)TypeError
Dog("doge");

當(dāng)然,use strict不能解決所有問(wèn)題,所以有了箭頭函數(shù)

參考

Javascript 嚴(yán)格模式詳解
the good parts

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

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

相關(guān)文章

  • JSthis 在各個(gè)場(chǎng)景下的指向

    摘要:聲明了一個(gè)函數(shù),并且將它作為一個(gè)構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用是函數(shù)的構(gòu)造函數(shù)調(diào)用。構(gòu)造函數(shù)中的在構(gòu)造函數(shù)調(diào)用中指向新創(chuàng)建的對(duì)象構(gòu)造函數(shù)調(diào)用的上下文是新創(chuàng)建的對(duì)象。來(lái)看看下面示例中的上下文正在進(jìn)行構(gòu)造函數(shù)調(diào)用,其中上下文是。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 1. this 的奧秘 很多時(shí)候, JS 中...

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

    摘要:箭頭函數(shù)沒(méi)有綁定,意味著箭頭函數(shù)內(nèi)部的值只能通過(guò)查找作用域鏈來(lái)確定。無(wú)論此后箭頭函數(shù)在何處執(zhí)行,該對(duì)象都是可用的。 箭頭函數(shù) es6的箭頭函數(shù),顧名思義箭頭函數(shù)是使用一個(gè)箭頭( => )來(lái)定義的函數(shù),這很容易理解但是它有很多行為與傳統(tǒng)的js函數(shù)不同: 沒(méi)有 this 、 super 、 arguments 。 不能被使用 new 調(diào)用: 箭頭函數(shù)沒(méi)有 [[Construct]] 方法...

    songjz 評(píng)論0 收藏0
  • use strictJS(二):函數(shù)傳參模式arguments

    摘要:系列系列列表從看一與箭頭函數(shù)從看二函數(shù)傳參模式與的上一篇說(shuō)到,對(duì)做了以下限定。是另外一個(gè)變量,指向不同的值,而這兩個(gè)值有相同的類(lèi)型。函數(shù)中,和指向同一個(gè)值,更改的就等于更改了的。可以用改進(jìn)問(wèn)題是這個(gè)在嚴(yán)格模式下不能運(yùn)行。 系列 系列列表:從use strict看JS(一):this與箭頭函數(shù)從use strict看JS(二):函數(shù)傳參模式與arguments use strict 的 ...

    kycool 評(píng)論0 收藏0
  • jsthis的幾種用法

    摘要:的幾種用法關(guān)于是什么理論上是執(zhí)行上下文的一個(gè)屬性,的值在進(jìn)入到執(zhí)行上下文的時(shí)候就已經(jīng)確定了,且不會(huì)再改變。默認(rèn)綁定這種情況下,不屬于任何一個(gè)函數(shù)方法內(nèi),即在全局作用域下,這種情況下稱(chēng)為默認(rèn)綁定。最后的總結(jié)用偽代碼的形式來(lái)表示例外例外本文參考 this的幾種用法 關(guān)于this this是什么? 理論上this是執(zhí)行上下文的一個(gè)屬性,this的值在進(jìn)入到執(zhí)行上下文的時(shí)候就已經(jīng)確定了,且不會(huì)...

    melody_lql 評(píng)論0 收藏0
  • jsthis的“終極三問(wèn)”

    摘要:是什么本質(zhì)是一個(gè)綁定,在函數(shù)被調(diào)用時(shí)建立。它的指向是完全由函數(shù)被調(diào)用的調(diào)用點(diǎn)來(lái)決定的。因?yàn)楹瘮?shù)的調(diào)用點(diǎn)在全局作用域,所以指向全局變量這里就是函數(shù)的調(diào)用點(diǎn)存在的意義在函數(shù)體內(nèi)部指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。從而實(shí)現(xiàn)干凈的設(shè)計(jì)和更容易的復(fù)用。 this是什么? this 本質(zhì)是一個(gè)綁定, 在函數(shù)被調(diào)用時(shí)建立。它的指向是完全由函數(shù)被調(diào)用的調(diào)用點(diǎn)來(lái)決定的。 function baz() { ...

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

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

0條評(píng)論

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