這篇文章帶給大家的內容是關於js閉包中this指向的解決方法(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
下面是一個問題,物件方法中定義的子函數,子函數執行時this指向哪裡?
三個問題:
#
(1)以下程式碼中列印的this是個什麼物件?
(2)這段程式碼能否實現讓myNumber.value加1的功能?
(3)在不放棄helper函數的前提下,有哪些修改方法可以達到正確的功能?
var myNumber = { value: 1, add: function(i){ var helper = function(i){ console.log(this); this.value += i; } helper(i); } } myNumber.add(1);
1.this指向window物件(因為匿名函數的執行具有全域性,所以其this物件指向window);
2. 無法實作value加1(每個函數在被呼叫時都會自動取得兩個特殊變量,this和arguments,內部函數在搜尋這兩個物件時,只會搜尋到其活動物件為止,所以無法實作存取外部函數的this物件);
3. 修改程式碼實作正確功能
方法一:
var myNumber={ value:1, add:function(i){ var that=this;//定义变量that用于保存上层函数的this对象 var helper=function(i){ console.log(that); that.value+=i; } helper(i); } } myNumber.add(1);
方法二:
var myNumber={ value:1, add:function(i){ var helper=function(i){ this.value+=i; } helper.apply(this,[i]);//使用apply改变helper的this对象指向,使其指向myNumber对象 } } myNumber.add(1);
方法三:
var myNumber={ value:1, add:function(i){ var helper=function(i){ this.value+=i; }.bind(this,i);//使用bind绑定,和apply相似,只是它返回的是对函数的引用,不会立即执行 helper(i); } } myNumber.add(1);
相關推薦:
以上是js閉包中this指向的解決方法(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!