javascript - 關(guān)于this的一個(gè)疑問(wèn)
問(wèn)題描述
如圖所示,請(qǐng)問(wèn)各位大佬,為什么foo.call()第一個(gè)參數(shù)是window?
問(wèn)題解答
回答1:其實(shí)問(wèn)題關(guān)鍵是對(duì)于call/apply函數(shù)的作用不理解。用官方的話(huà)來(lái)說(shuō)是,改變作用域上下文,只是這里為將局部的上下文改變?yōu)閣indow。其實(shí)call/apply是一種'借刀殺人'的方法,就是自己沒(méi)有某個(gè)屬性或方法,然后想調(diào)用其他對(duì)象的屬性或方法,也是對(duì)象繼承的一種實(shí)現(xiàn)方式。
回答2:其實(shí)不是必須是windouws 也沒(méi)比用用call 只需要在f里面聲明 var that=this 把閉包的函數(shù)的this寫(xiě)成that就好了,這是因?yàn)殚]包的函數(shù) 不能直接得到上層函數(shù)的環(huán)境變量 只能得到windous 所以聲明就ok 了 不懂的可以問(wèn)我
回答3:如果是前端,函數(shù)有一個(gè)隱形的參數(shù)this,默認(rèn)的就是指向window這個(gè)全局變量。除非你改變this指向的對(duì)象 比如foo.call(其他對(duì)象)原句是用了默認(rèn)的this參數(shù)注解是明確聲明了this指向的就是window
我再寫(xiě)幾句,否則說(shuō)去清楚
var foo = function () { console.log(this.x);}foo();為什么this指向window呢
另外this的語(yǔ)義是 指向調(diào)用本函數(shù)的對(duì)象。每個(gè)函數(shù)都需要一個(gè)對(duì)象來(lái)調(diào)用obj.f()表示f被obj的調(diào)用而前端如果沒(méi)有指定調(diào)用對(duì)象,默認(rèn)的都是全局變量window來(lái)調(diào)用函數(shù)
回答4:javascript在設(shè)計(jì)的時(shí)候就會(huì)將內(nèi)部函數(shù)(即函數(shù)體中的函數(shù))中的this綁定到全局對(duì)象(即window)上,我覺(jué)得這里注釋寫(xiě)著foo.call(window)應(yīng)該只是用js語(yǔ)言來(lái)解釋了一下為什么foo()中的this.x會(huì)輸出10。
回答5:沒(méi)有說(shuō)foo.call的第一個(gè)參數(shù)必須是window,題主要理解的是什么是call。
https://developer.mozilla.org...
回答6:可以了解下call,apply,bind的作用與區(qū)別
相關(guān)文章:
1. java固定鍵值轉(zhuǎn)換,使用枚舉實(shí)現(xiàn)字典?2. javascript - 移動(dòng)端開(kāi)發(fā) H5 頁(yè)面在 iOS手機(jī)上無(wú)法實(shí)現(xiàn) 長(zhǎng)按復(fù)制文本 求解決3. 如何解決tp6在zend中無(wú)代碼提示4. java - HTTPS雙向認(rèn)證基礎(chǔ)上有無(wú)必要再進(jìn)行加簽驗(yàn)簽?5. vim - win10無(wú)法打開(kāi)markdown編輯器6. html - 如何使用用戶(hù)輸入的數(shù)據(jù)去運(yùn)行一個(gè)數(shù)學(xué)公式,最后怎么返回。7. python - flask學(xué)習(xí),user_syy添加報(bào)role is invalid keyword for User.8. 這是什么情況???9. css3 - less或者scss 顏色計(jì)算的知識(shí)應(yīng)該怎么學(xué)?或者在哪里學(xué)?10. javascript - 有沒(méi)有類(lèi)似高鐵管家的時(shí)間選擇插件
