JS 裡為什麼會有 this

2021-09-14 04:34:00 字數 2173 閱讀 7851

這篇文章是從語言創造者(js 之父的角度)來思考 this,我之前那篇講 this 的文章是從使用者的角度寫的。

假設我們有乙個物件

var person = ,

saybye: function()

}

這個 person 物件有 name 和 age 屬性,還有乙個 sayhi 方法,現在的需求是:

呼叫 person.sayhi(...),列印出「你好,我是 frank,今年 18 歲」。

呼叫 person.saybuy(...),列印出「再見,記得我叫 frank

哦,想約我的話打**給我,我的**是 13812345678」

需求就是這麼簡單,通過達成這個需求,我們就能理解 this 的本質。

var person = ,今年 $ 歲')

},saybye: function(name, phone)哦,想約我的話打**給我,我的**是 $')

}}

呼叫方式是

person.sayhi(person.name, person.age)

person.saybye(person.name, person.phone)

別急,我知道這**很傻,接下來改進。

上面方法中,每次都要在呼叫的時候自行選擇 person.name 作為引數,真的很傻,不如直接傳入乙個 person,**如下:

var person = ,今年 $ 歲')

},saybye: function(self) 哦,想約我的話打**給我,我的**是 $')

}}

呼叫方式是

person.sayhi(person)

person.saybye(person)

稍微好一點了,但是這**依然很傻。

為什麼不能把引數裡的 person 省掉,變成 person.sayhi() 就好了。

開發者最想要的呼叫方式是 person.sayhi(),那麼問題來了,如果 person.sayhi() 沒有實參,person.sayhi 函式是如何接收到 person 的呢?

方法1:依然把第乙個引數 self 當做 person,這樣形參就會永遠比實參多出乙個 self

方法2:隱藏 self,然後用關鍵字 this 來訪問 self。

js 之父選擇了方法2,用 this 訪問 self。python 之父選擇了方法1,留下 self 作為第乙個引數。

過程如下:

// 用 this 之前:

sayhi: function(self),今年 $ 歲')

}// 用 this 之後:

sayhi: function(),今年 $ 歲')

}

用了 this 之後,完整**如下:

var person = ,今年 $ 歲')

},saybye: function() 哦,想約我的話打**給我,我的**是 $')

}}

現在輪到新手疑惑了,這個 this 到底是個啥玩意兒?從哪來的呀?

實際上 this 是隱藏的第乙個形參。在你呼叫 person.sayhi() 時,這個 person 會「變成」 this。

很多 js 高手不屑於用 this,覺得 this 不夠單純。所以 js 之父給高手們準備了無糖的 .call 方法。

person.sayhi.call(person) 就等價於 person.sayhi()

.call 的第乙個引數就是顯式的 person,沒有任何語法糖。

所以高手一般用 obj.fn.call(null,1,2,3) 來手動禁用 this。

這樣一來 person.sayhi.call 的引數其實可以是任何物件。

也就是說 person.sayhi 雖然是 person 的方法,但是是可以呼叫在任何物件上的。

js 沒有類沒有方法,只有物件和函式。

js 加了 class 關鍵字之後,勉強弄出來乙個假的類。

this 是連線物件和函式的橋梁。

相比於 js,我更喜歡 python 的方式,不使用 this 關鍵字,而是使用 self 形參,更易懂。

為什麼會有異常

為什麼會有異常?為了使程式更好的執行。很多教程裡都舉例 10 0 0不能作為分母 這樣會報異常。我常想,那麼為什麼不用if else來解決這件的問題。然而,真實的情況是 我們並不知道未來會發生什麼。比如說,電腦乙個資料夾路徑,本來我用的好好的,突然有一天,來了乙個人,將這個檔案剪下走了,我並不知道這...

為什麼會有滑動視窗

既然我們已經有了滾動視窗,為什麼還需要滑動視窗呢?也就是滑動視窗的意義是什麼?其實滾動視窗和滑動視窗並沒有特別的應用場景要求,也就是說到底什麼時候用滑動視窗,什麼時候用滾動視窗完全根據需求來決定.那麼滑動視窗和滾動視窗的區別是什麼?當我們需要更細粒度的統計計算,需要使用滑動視窗.可能有人會問那我們使...

為什麼會有epoll技術

為什麼會有epoll這個技術的產生呢?select 和poll 函式,這兩系統函式每次呼叫都需要我們 提供給它所要需要偵聽的socket檔案描述符集合 select 和poll 函式的返回值是個int整型值,只能代表有 幾個socket就緒或者是有錯誤了 它沒辦法表示出是哪個 具體是哪幾個socke...