var length = 10;
function cl() {
console.log(this.length);
}
var o = {
length: 20,
show: function (fn) {
fn();
arguments[0]();
}
}
o.show(cl); // 10
關於這題 我想知道js中this不是誰調用就指向誰麼?為什麼 第一次呼叫 cl中的this還是指向window而不是o物件?我知道沒有用call
估計就不對了,但是為什麼不對呢?
第二個有為什麼指向了arguments?
同時 這段程式碼在nodejs中運行時為什麼第一次輸出為undifined?
直接使用函數名字調用,無論你外麵包了多少層,調用者就是
window
。因為那個方括號運算符,方括號運算符作為物件取值運算,在某種意義上是可以等於點
.
運算符的,所以這裡在形式上其實可以類比成arguments.0()
,你看,這不就是arguments
來呼叫了這個函數了嘛,所以運行的時候this
就指向它了。this的指向不是在聲明的時候確定的而是在呼叫的時候被定義的有這麼多種情況
普通函數調用,this為全域物件或是undefined
作為物件的方法,this為那個物件
new 表達式,this為以該函數為原型的新建立的物件
使用 apply/call指定 this
用bind綁定固定的this
事件處理函數中的this是當前的觸發事件的DOM元素(event.currentTarget)
不知道對你有沒有幫助
就這題而言。
o.show()執行,那麼show函數作用域裡面用到的this都指向o.
但其實這裡是在裡面調用fn(), fn並不是o去調用的,沒有o.fn...一個比較low的原則就是函數呼叫點前面是誰,函數裡面的this是誰。 這裡肯定是預設的window了。
arguments[0] ==> arguments.0
數組也是對象,[]調用跟 . 同理,所以this就是arguments
關於node中,由於是模組化,this指向的是global,而且var 宣告的時候不會像瀏覽器中,有window呼叫。 node中是沒有這個機制的。
雷雷
。 🎜o.show()
的this
指向o
,但和本題無關。o.show()
中的fn
標識符解析得到一個引用類型(內部類型),其base
屬性(本題中值為show()
方法的活動對象)即是this
的指向。因為活動物件回傳null
,所以this
指向null
,從而指向了window
。arguments[0]()
的arguments[0]
同樣回傳一個引用類型,其base
屬性的值為arguments
,所以this
指向arguments
arguments