javascript - 關(guān)于this的指向性問題
問題描述
var foo = 'window';var obj = { foo : 'obj', getFoo : function(){return function(){ return this.foo;}; }};var f = obj.getFoo();console.log(f()); //結(jié)果:window
為什么上述代碼的運(yùn)行結(jié)果是window呢?
問題解答
回答1:obj.getFoo() 返回一個(gè)方程,賦值給了 f 。f 通過 f() 被調(diào)用,沒有明確的調(diào)用者,所以 this 就是 window 。
想要的到 'obj' ,可以這樣做
var foo = 'window';var obj = { foo : 'obj', getFoo : function(){var self = this;return function(){ return self.foo;}; }};var f = obj.getFoo();console.log(f());回答2:
因?yàn)椋趂()實(shí)際運(yùn)行的地方,this是window,由于沒有通過call或者bind改變上下文,所以輸出的就是window。
可以按照如下替換方法:
console.log(f());// ----->console.log(obj.getFoo());// ----->console.log(function() { var self = this; return function() {return self.foo }});
這里的self就是指向window了,所以return self.foo就是return window.foo,也就是’window’。
回答3:其實(shí)最簡單的理解就是obj.getFoo給了f,然后再看這方法運(yùn)行的位置在哪.
f = function () { return function () {return this.foo }}回答4:
console.log(f())中f()是獨(dú)立被調(diào)用的 1.如果調(diào)用者函數(shù),被某一個(gè)對象所擁有,那么該函數(shù)在調(diào)用時(shí),內(nèi)部的this指向該對象。2.如果函數(shù)獨(dú)立調(diào)用,那么該函數(shù)內(nèi)部的this,則指向undefined。推薦閱讀 http://www.jianshu.com/p/d647... 希望對你有所幫助
回答5:函數(shù)執(zhí)行,函數(shù)體內(nèi)的this指向函數(shù)的調(diào)用方
1、下面這段代碼,getFoo函數(shù)的調(diào)用方是obj,所以getFoo函數(shù)內(nèi)部的this指向obj對象
var f = obj.getFoo()
2、getFoo函數(shù)返回了一個(gè)匿名函數(shù)賦給變量f,再執(zhí)行函數(shù)f,此時(shí)變量f是掛載到window上的,函數(shù)f的調(diào)用方是window,函數(shù)f內(nèi)部的this也指向window
console.log(f()); //結(jié)果:window
相關(guān)文章:
1. 如何解決Centos下Docker服務(wù)啟動(dòng)無響應(yīng),且輸入docker命令無響應(yīng)?2. 我在centos容器里安裝docker,也就是在容器里安裝容器,報(bào)錯(cuò)了?3. objective-c - IOS 分享到微信 提示 應(yīng)用消息數(shù)據(jù)錯(cuò)誤4. android - 使用百度sdk調(diào)用SDKInitializer.initialize(this)時(shí)報(bào)錯(cuò)?5. javascript - 微信h5發(fā)送圖文信息,部分設(shè)備點(diǎn)擊“發(fā)送”按鈕時(shí)沒反應(yīng),問題較難重現(xiàn),如何能找到可能存在問題的點(diǎn)?6. javascript - 音樂播放器-圖片旋轉(zhuǎn)7. android - 為 AppBarLayout 設(shè)置的背景圖片 TransitionDrawable 為什么只在第一次打開的時(shí)候有效?8. javascript - js中遞歸與for循環(huán)同時(shí)發(fā)生的時(shí)候,代碼的執(zhí)行順序是怎樣的?9. MySQL timestamp的默認(rèn)值怎么設(shè)置?10. docker 17.03 怎么配置 registry mirror ?
