這篇文章給大家分享的內容是關於實例解析Js中的this,有需要的朋友可以參考一下
前幾天在看面試題的時候看到了這樣一段程式:
obj = { name: 'a', getName: function () { console.log(this.name); } }; var fn = obj.getName;obj.getName();fn();
要求問題是這裡fn()
執行的結果和執行時this
的指向問題。以下結合這個例子與其中的疑問重新總結一下this的使用。
this的指向要根據其執行環境來決定,主要有以下幾種情況:
全域環境即在任何函數的外部,使用this,則this都指涉全域物件。如在瀏覽器中:
this === window // true
在函數上下文環境,即函數內部呼叫使用this,取決於this的呼叫方式。
在簡單呼叫時,函數中的this指向全域對象,例如:
function myFun() { console.log(this === window); } myFun(); // true
上面這個例子中直接呼叫了函數myFun
,其中的this
就等於全域物件window
。
其中的原理就是在宣告myFun
這一函數時,它作為全域物件的一個屬性存在。所以直接使用此函數時,即相當於調用了window.myFun()
,即其作為window
的屬性被調用時this
即指向window
。
在瀏覽器中調試這段程式能更清楚的驗證:
當函數作為物件的方法被呼叫時,其this即指向這個物件。以一開始的例子來說,其執行obj.getName()
時,函數中的this即指向了obj這個物件。所以輸出a
。
但是當我們將這個函數單獨分離開,把一開始的例子改變一下:
function myFun() { console.log(this.name); }var obj = { name: 'a', getName: myFun }; obj.getName(); // avar obj2 = { name: 'b', fun: myFun }; obj2.fun(); // b
從這個例子可以看出,this
的指向完全取決於最靠近的成員引用,將函數綁定在哪個對象,哪個引用上,則this就有不同的指向。在上例中我們將帶有this
的函數分別綁定到了不同的物件上作為其方法,則其this對應著便綁定到不同的物件上,this.name
的值便不同。
同理,當我們直接執行myFun()
時,此函數即作為全域物件window
的一個屬性來呼叫。所以找不到myName
屬性,輸出undefined
。 (因為全域物件window
有預設屬性name
為空字串,此處使用myName
作為範例)
function myFun() { console.log(this.myName); } myFun(); // undefined
最後,解釋一開始的例子,將obj.getName
賦值給了fn
,所以,執行fn
時即相當於執行了 window.fn()
,也就是這個一開始初始化為obj的屬性的匿名函數被綁定到了window
的fn
屬性上,所以其this
指向window
。
由window
的name
屬性為空字串,所以輸出為空。
相關推薦:
以上是實例解析Js中的this的詳細內容。更多資訊請關注PHP中文網其他相關文章!