javascript - 關(guān)于Js中 this的一道題
問題描述
var length = 10;function cl() { console.log(this.length);}var o = { length: 20, show: function (fn) {fn();arguments[0](); }}o.show(cl); // 10
關(guān)于這道題 我想知道js中this不是誰調(diào)用就指向誰么? 為什么 第一次調(diào)用 cl中的this還是指向window而不是o對象?我知道沒有用call估計就不對了,但是為什么不對呢?第二個有為什么指向了arguments?
同時 這段代碼在nodejs中運(yùn)行時為什么第一次輸出為undifined?
問題解答
回答1:直接使用函數(shù)名字調(diào)用,無論你外面包了多少層,調(diào)用者就是window。
因為那個方括號運(yùn)算符,方括號運(yùn)算符作為對象取值運(yùn)算,在某種意義上是可以等于點.運(yùn)算符的,所以這里在形式上其實可以類比成arguments.0(),你看,這不就是arguments來調(diào)用了這個函數(shù)了嘛,所以運(yùn)行的時候this就指向它了。
回答2:this的指向不是在聲明的時候確定的而是在調(diào)用的時候被定義的有這么幾種情況
普通函數(shù)調(diào)用,this為全局對象或是undefined
作為對象的方法,this為那個對象
new 表達(dá)式,this為以該函數(shù)為原型的新創(chuàng)建的對象
使用 apply/call指定 this
用bind綁定固定的this
事件處理函數(shù)中的this是當(dāng)前的觸發(fā)事件的DOM元素(event.currentTarget)
不知道對你有沒有幫助
回答3:就這道題而言。
o.show()執(zhí)行,那么show函數(shù)作用域里面用到的this都指向 o.但其實這里是在里面調(diào)用fn(), fn并不是o去調(diào)用的,沒有o.fn... 一個比較low的原則就是函數(shù)調(diào)用點前面是誰,函數(shù)里面的this就是誰。 這里肯定是默認(rèn)的window了。
arguments[0] ==> arguments.0數(shù)組也是對象,[]調(diào)用跟 . 同理,所以this就是arguments
關(guān)于node中,由于是模塊化,this指向的是global,而且var 聲明的時候不會像瀏覽器中,有window調(diào)用。node中是沒有這個機(jī)制的。
回答4:o.show(cl) ==>相當(dāng)于 o.show(function(){console.log(this) //windows});回答5:
o.show()的this指向o,但和本題無關(guān)。o.show()中的fn標(biāo)識符解析得到一個引用類型(內(nèi)部類型),其base屬性(本題中值為show()方法的活動對象)即是this的指向。因為活動對象返回null,所以this指向null,從而指向了window。arguments[0]()的arguments[0]同樣返回一個引用類型,其base屬性的值為arguments,所以this指向arguments。
相關(guān)文章:
1. android - NavigationView 的側(cè)滑菜單中如何保存新增項(通過程序添加)2. 微信小程序可以用gulp,webpack嗎?3. python - 為什么正常輸出中文沒有亂碼,zip函數(shù)之后出現(xiàn)中文編程unicode編碼的問題,我是遍歷輸出的啊。4. mysql服務(wù)無法啟動1067錯誤,誰知道正確的解決方法?5. ueditor上傳服務(wù)器提示后端配置項沒有正常加載,求助!!!!!6. 提示語法錯誤語法錯誤: unexpected ’abstract’ (T_ABSTRACT)7. tp5 不同控制器中的變量調(diào)用問題8. 這段代碼既不提示錯誤也看不到結(jié)果,請老師明示錯在哪里,謝謝!9. php7.3.4中怎么開啟pdo驅(qū)動10. 老師 我是一個沒有學(xué)過php語言的準(zhǔn)畢業(yè)生 我希望您能幫我一下
