2012-03-08 89 views
1

我剛剛重組我的代碼到對象中,並使用這個關鍵字,我有這個問題,設置道具的作品,但是當第二種方法觸發時,myProp未定義。我注意到,如果我使用myObj來設置和獲取而不是它,它工作正常。這裏有什麼區別?我究竟做錯了什麼?我雖然這是指只有一個由對象文字自動實例化的實例。爲什麼我無法在我的對象字面值中訪問this.property?

var myObj = { 
    SetProp: function (id) { 
     this.myProp = "abc"; 
     Ajax.GetJSONAfterStandardLogic(Utility.PrefixURL("/ajax/mymethod"), this.SetPropSuccess); 
    }, 
    SetPropSuccess: function (response) { 
     console.log("test " + this.myProp); 
    } 
} 
+0

因爲'this'指的是在這種情況下的函數'SetPropSuccess'。 – 2012-03-08 23:19:09

+0

[JavaScript中的this「範圍]的可能重複(http://stackoverflow.com/questions/2253955/scope-of-this-in-javascript)< - 有很多,但這是第一個我遇到了一個明確的答案。 – 2012-03-08 23:19:21

回答

1

可能的,因爲當你調用這些函數,this不是對象。 this是與函數被調用的綁定。

多一點代碼來說明你是如何調用該函數是有用的,但你可以把它用工作:

myObj.SetProp.call(myObj, id) 

這種結合MyObj中作爲this,爲SetProp函數調用。

如果您將console.log(this)置於其中任一功能中,您可能會發現this不是您所期望的。

1

當你的回調函數被執行時,它在不同的範圍內。因爲「this」引用了該範圍,而您的「myProp」未定義。這就是使用myObj.myProp的原因 - 範圍仍然有效。

乾杯

+0

'this'不是由作用域設置的,它是由函數的調用方式設置的。 – nnnnnn 2012-03-09 00:21:38

1

this變量根據一個函數是如何被調用設置。當您使用objectReference.method()「點」語法時,this將自動設置爲該對象。您還可以調用一個函數,並通過使用.call().apply()this明確設置爲某個其他對象。

在你的情況,當你通過this.SetPropSuccess爲你傳遞給函數的引用,當它隨後被GetJSONAfterStandardLogic()稱它沒有在那臺this到您的對象的方式調用回調函數(最有可能將等於window)。您可以解決該問題通過在SetProp()一個局部變量保存到對象的引用:

var myObj = { 
    SetProp: function (id) { 
     var self = this; 
     this.myProp = "abc"; 
     Ajax.GetJSONAfterStandardLogic(Utility.PrefixURL("/ajax/mymethod"), 
             function() { self.SetPropSuccess(); }); 
    }, 
    SetPropSuccess: function (response) { 
     console.log("test " + this.myProp); 
    } 
} 

通過封閉的魔力,我已經添加了一個回調的匿名函數傳遞給GetJSONAfterStandardLogic()訪問到包含範圍內的變量SetProp()即使在SetProp()已經完成執行

底線是,你必須習慣於JavaScript中的this,其工作方式與Java和C#等基於類的OO語言的工作方式截然不同。 JavaScript仍然是面向對象的,但是這些差異通常會影響來自Java或C#的語言。

更多閱讀:https://developer.mozilla.org/en/JavaScript/Reference/Operators/this

相關問題