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í)可以類比成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è)引用類型(內(nèi)部類型),其base屬性(本題中值為show()方法的活動(dòng)對(duì)象)即是this的指向。因?yàn)榛顒?dòng)對(duì)象返回null,所以this指向null,從而指向了window。arguments[0]()的arguments[0]同樣返回一個(gè)引用類型,其base屬性的值為arguments,所以this指向arguments。
相關(guān)文章:
1. python - sqlalchemy更新數(shù)據(jù)報(bào)錯(cuò)2. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?3. javascript - h5微信中怎么禁止橫屏4. macos - 無(wú)法source activate python275. empty比isset更嚴(yán)格一點(diǎn)6. thinkphp6使用驗(yàn)證器 信息如何輸出到前端頁(yè)面7. 我在導(dǎo)入模板資源時(shí)遇到無(wú)法顯示的問(wèn)題,請(qǐng)老師解答下8. PHPExcel表格導(dǎo)入數(shù)據(jù)庫(kù)怎么導(dǎo)入9. javascript - 微信網(wǎng)頁(yè)開(kāi)發(fā)從菜單進(jìn)入頁(yè)面后,按返回鍵沒(méi)有關(guān)閉瀏覽器而是刷新當(dāng)前頁(yè)面,求解決?10. 預(yù)訂金和尾款分別支付

網(wǎng)公網(wǎng)安備