javascript - 關(guān)于Js中 this的一道題
問(wèn)題描述
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不是誰(shuí)調(diào)用就指向誰(shuí)么? 為什么 第一次調(diào)用 cl中的this還是指向window而不是o對(duì)象?我知道沒(méi)有用call估計(jì)就不對(duì)了,但是為什么不對(duì)呢?第二個(gè)有為什么指向了arguments?
同時(shí) 這段代碼在nodejs中運(yùn)行時(shí)為什么第一次輸出為undifined?
問(wèn)題解答
回答1:直接使用函數(shù)名字調(diào)用,無(wú)論你外面包了多少層,調(diào)用者就是window。
因?yàn)槟莻€(gè)方括號(hào)運(yùn)算符,方括號(hào)運(yùn)算符作為對(duì)象取值運(yùn)算,在某種意義上是可以等于點(diǎn).運(yùn)算符的,所以這里在形式上其實(shí)可以類(lèi)比成arguments.0(),你看,這不就是arguments來(lái)調(diào)用了這個(gè)函數(shù)了嘛,所以運(yùn)行的時(shí)候this就指向它了。
回答2:this的指向不是在聲明的時(shí)候確定的而是在調(diào)用的時(shí)候被定義的有這么幾種情況
普通函數(shù)調(diào)用,this為全局對(duì)象或是undefined
作為對(duì)象的方法,this為那個(gè)對(duì)象
new 表達(dá)式,this為以該函數(shù)為原型的新創(chuàng)建的對(duì)象
使用 apply/call指定 this
用bind綁定固定的this
事件處理函數(shù)中的this是當(dāng)前的觸發(fā)事件的DOM元素(event.currentTarget)
不知道對(duì)你有沒(méi)有幫助
回答3:就這道題而言。
o.show()執(zhí)行,那么show函數(shù)作用域里面用到的this都指向 o.但其實(shí)這里是在里面調(diào)用fn(), fn并不是o去調(diào)用的,沒(méi)有o.fn... 一個(gè)比較low的原則就是函數(shù)調(diào)用點(diǎn)前面是誰(shuí),函數(shù)里面的this就是誰(shuí)。 這里肯定是默認(rèn)的window了。
arguments[0] ==> arguments.0數(shù)組也是對(duì)象,[]調(diào)用跟 . 同理,所以this就是arguments
關(guān)于node中,由于是模塊化,this指向的是global,而且var 聲明的時(shí)候不會(huì)像瀏覽器中,有window調(diào)用。node中是沒(méi)有這個(gè)機(jī)制的。
回答4:o.show(cl) ==>相當(dāng)于 o.show(function(){console.log(this) //windows});回答5:
o.show()的this指向o,但和本題無(wú)關(guān)。o.show()中的fn標(biāo)識(shí)符解析得到一個(gè)引用類(lèi)型(內(nèi)部類(lèi)型),其base屬性(本題中值為show()方法的活動(dòng)對(duì)象)即是this的指向。因?yàn)榛顒?dòng)對(duì)象返回null,所以this指向null,從而指向了window。arguments[0]()的arguments[0]同樣返回一個(gè)引用類(lèi)型,其base屬性的值為arguments,所以this指向arguments。
相關(guān)文章:
1. php - 請(qǐng)問(wèn)大批量數(shù)據(jù)處理,如何分割?2. javascript - vue過(guò)渡效果 css過(guò)渡 類(lèi)名的先后順序3. MySQL主鍵沖突時(shí)的更新操作和替換操作在功能上有什么差別(如圖)4. 數(shù)據(jù)庫(kù) - Mysql的存儲(chǔ)過(guò)程真的是個(gè)坑!求助下面的存儲(chǔ)過(guò)程哪里錯(cuò)啦,實(shí)在是找不到哪里的問(wèn)題了。5. html5和Flash對(duì)抗是什么情況?6. css右浮動(dòng)字的順序顛倒了7. ios - 類(lèi)似微博首頁(yè),一張圖的時(shí)候是如何確定圖大小的?8. javascript - 我是做web前端的,公司最近有一個(gè)項(xiàng)目關(guān)于數(shù)據(jù)統(tǒng)計(jì)的!9. javascript - 如何使用loadash對(duì)[object,object,object]形式的數(shù)組進(jìn)行比較10. javascript - vuejs+elementui 購(gòu)物車(chē)價(jià)格計(jì)算,點(diǎn)擊加減號(hào)修改數(shù)量總價(jià)都不會(huì)改變,但是計(jì)算執(zhí)行了
