最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS 里為什么會(huì)有 this

 更新時(shí)間:2021年10月11日 09:31:31   作者:方應(yīng)杭  
這篇文章主要介紹了JS 里為什么會(huì)有 this,文章主要從語(yǔ)言創(chuàng)造者(JS 之父的角度)來(lái)思考 this,我之前那篇講 this 的文章是從使用者的角度寫的,需要的朋友可以參考一下

1、需求

假設(shè)我們有一個(gè)對(duì)象

var person = {
    name: 'Frank',
    age: 18,
    phone: '13812345678',
    sayHi: function(){
      // 待補(bǔ)充
    },
    sayBye: function(){
      // 待補(bǔ)充
    }
}

這個(gè) person 對(duì)象有 name age 屬性,還有一個(gè) sayHi 方法,現(xiàn)在的需求是:

調(diào)用 person.sayHi(...) ,打印出「你好,我是 Frank,今年 18 歲」。
調(diào)用 person.sayBuy(...) ,打印出「再見,記得我叫 Frank 哦,想約我的話打電話給我,我的電話是 13812345678」

求就是這么簡(jiǎn)單,通過達(dá)成這個(gè)需求,我們就能理解 this 的本質(zhì)。

2、方案

var person = {
    ...
    sayHi: function(name, age){
      console.log('你好,我是 ${name},今年 ${age} 歲')
    },
    sayBye: function(name, phone){
      console.log('再見,記得我叫 ${name} 哦,想約我的話打電話給我,我的電話是 ${phone}')
    }
}

調(diào)用方式是

person.sayHi(person.name, person.age)
person.sayBye(person.name, person.phone)

別急,我知道這代碼很傻,接下來(lái)改進(jìn)。

3、第一次改進(jìn)

上面方法中,每次都要在調(diào)用的時(shí)候自行選擇 person.name 作為參數(shù),真的很傻,不如直接傳入一個(gè) person,代碼如下:

var person = {
    ...
    sayHi: function(self){
      console.log('你好,我是 ${self.name},今年 ${self.age} 歲')
    },
    sayBye: function(self){
      console.log('再見,記得我叫 ${self.name} 哦,想約我的話打電話給我,我的電話是 ${self.phone}')
    }
}

調(diào)用方式是

person.sayHi(person)
person.sayBye(person)

稍微好一點(diǎn)了,但是這代碼依然很傻。
為什么不能把參數(shù)里的 person 省掉,變成 person.sayHi() 就好了。

4、加糖

開發(fā)者最想要的調(diào)用方式是 person.sayHi(),那么問題來(lái)了,如果 person.sayHi() 沒有實(shí)參,person.sayHi 函數(shù)是如何接收到 person 的呢?

  • 方法1:依然把第一個(gè)參數(shù) self 當(dāng)做 person,這樣形參就會(huì)永遠(yuǎn)比實(shí)參多出一個(gè) self
  • 方法2:隱藏 self,然后用關(guān)鍵字 this 來(lái)訪問 self

JS 之父選擇了方法2,用 this 訪問 self。Python 之父選擇了方法1,留下 self 作為第一個(gè)參數(shù)。

過程如下:

// 用 this 之前:
sayHi: function(self){
    console.log('你好,我是 ${self.name},今年 ${self.age} 歲')
}
// 用 this 之后:
sayHi: function(){
    // this 就是 self
    console.log('你好,我是 ${this.name},今年 ${this.age} 歲')
}

5、費(fèi)解

用了 this 之后,完整代碼如下:

var person = {
    name: 'Frank',
    age: 18,
    phone: '13812345678',
    sayHi: function(){
      console.log('你好,我是 ${this.name},今年 ${this.age} 歲')
    },
    sayBye: function(){
      console.log('再見,記得我叫 ${this.name} 哦,想約我的話打電話給我,我的電話是 ${this.phone}')
    }
}

現(xiàn)在輪到新手疑惑了,這個(gè) this 到底是個(gè)啥玩意兒?從哪來(lái)的呀?

實(shí)際this 是隱藏的第一個(gè)形參。在你調(diào)用 person.sayHi() 時(shí),這個(gè) person 會(huì)「變成」 this。

6、存在問題

很多 JS 高手不屑于用 this,覺得 this 不夠單純。所以 JS 之父給高手們準(zhǔn)備了無(wú)糖的 .call 方法。

person.sayHi.call(person) 就等價(jià)于 person.sayHi()

.call 的第一個(gè)參數(shù)就是顯式的 person,沒有任何語(yǔ)法糖。

所以高手一般用 obj.fn.call(null,1,2,3) 來(lái)手動(dòng)禁用 this。

這樣一來(lái) person.sayHi.call 的參數(shù)其實(shí)可以是任何對(duì)象。

也就是說 person.sayHi 雖然是 person 的方法,但是是可以調(diào)用在任何對(duì)象上的。

7、對(duì)象與函數(shù)

JS 沒有類沒有方法,只有對(duì)象和函數(shù)。

JS 加了 class 關(guān)鍵字之后,勉強(qiáng)弄出來(lái)一個(gè)假的類。

this 是連接對(duì)象和函數(shù)的橋梁。

相比于 JS,我更喜歡 Python 的方式,不使用 this 關(guān)鍵字,而是使用 self 形參,更易懂。

到此這篇關(guān)于JS 里為什么會(huì)有 this的文章就介紹到這了,更多相關(guān)JS 里為什么會(huì)有 this內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • canvas?中如何實(shí)現(xiàn)物體的框選

    canvas?中如何實(shí)現(xiàn)物體的框選

    這篇文章主要為大家介紹了canvas中如何實(shí)現(xiàn)物體的框選的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 最新評(píng)論

    安达市| 栾川县| 定西市| 乃东县| 香港| 郸城县| 进贤县| 潍坊市| 玉环县| 怀化市| 屏山县| 贵溪市| 沙田区| 临朐县| 景洪市| 丰原市| 博白县| 三门峡市| 青阳县| 景宁| 永吉县| 久治县| 孟村| 邵阳县| 隆林| 承德县| 天等县| 酒泉市| 鹿邑县| 河北省| 永宁县| 桑植县| 淳安县| 井冈山市| 罗源县| 遵义市| 湖口县| 新巴尔虎左旗| 曲松县| 政和县| 瑞丽市|