關於js中this的詳解

js的this分兩種,動態綁定和靜態綁定,並且只能在函數內出現,node模塊和es模塊中也能直接使用this,此時的this指向模塊自身。

在函數中使用時,除非函數是通過箭頭函數定義,其餘形式皆爲動態綁定。本質上,node模塊和基於模塊系統構建的瀏覽器環境模塊都是利用js閉包實現,所以也是函數。

靜態綁定的this指向詞法作用域上一級的對象。比如,在一個Plain Object中定義的淺層箭頭函數中的this就指向這個Object。淺層是指無嵌套。

Plain Object就是{}語法。動態綁定分爲4種。硬綁定,軟綁定,new綁定和全局綁定。

硬綁定是指在函數執行時,無論由哪個對象喚起函數,函數的this總是指向指定好的對象。

軟綁定是指,函數執行時this指向喚起函數的對象。

全局綁定是指,當函數被直接喚起時,this指向全局變量。當你在全局定義變量時,變量實際上作爲全局變量的屬性存在。在瀏覽器,這個對象是window。在node,這個對象是global。在serviceWorker,這個對象是self。

new綁定是指,當函數作爲構造函數被喚起時,this指向即將被創建的對象。可以使用new.target來判斷函數是否被new關鍵字調用。其中new.target和this指向同一個對象。

這四種綁定是具有優先級的。其中new>硬綁定>軟綁定>全局綁定。

一個函數在被定義時,除了靜態綁定,動態綁定默認使用三種,也就是非硬綁定的三種。這三種情況分別發生在new func(),obj.func()和func()。硬綁定需要特殊處理。在最新es中,可以使用Funcyion.prototype.bind進行硬綁定。

值得一提的是,靜態綁定也是作爲一種硬綁定存在,因爲函數一旦定義,其this指向就不會改變。所以靜態綁定又稱爲早硬綁定,bind成爲晚硬綁定。

 

這就是關於this的基本知識。

 

(內容引自北郵信通院導論課答疑羣)

發佈了7 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章