我刚刚将我的代码重构为对象并使用this关键字,我遇到了这个问题,设置道具工作,但是当第二个方法触发时,myProp
未定义。我注意到我是否使用myObj
来设置和获取而不是它可以正常工作。这有什么区别?我究竟做错了什么?我虽然这是指其中只有一个由对象文字自动实例化的实例。
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 :(得分:1)
可能因为当你调用这些函数时,this
不是对象。 this
是调用函数的绑定。
用于演示如何调用该函数的更多代码将非常有用,但您可以使用以下命令使其工作:
myObj.SetProp.call(myObj, id)
这将myObj绑定为this
,用于SetProp函数调用。
如果您将console.log(this)
放入其中任何一个函数中,您可能会发现this
不是您所期望的。
答案 1 :(得分:1)
执行回调函数时,它的范围不同。因此,“this”引用了范围,并且未定义“myProp”。这就是使用myObj.myProp工作的原因 - 范围仍然有效。
干杯
答案 2 :(得分:1)
根据函数的调用方式设置this
变量。当您使用objectReference.method()
" dot"语法this
将自动设置为该对象。您还可以使用this
或.call()
调用函数并将.apply()
显式设置为其他对象。
在您的情况下,当您将this.SetPropSuccess
作为回调函数传递时,您将传递对该函数的引用,然后在GetJSONAfterStandardLogic()
调用它时,它不会以设置{{}的方式调用1}}到你的对象(很可能它将等于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()
中的变量,即使在< / em> SetProp()
已完成。
最重要的是,你必须习惯JavaScript中的SetProp()
与它在基于类的OO语言(如Java和C#)中的工作方式有很大不同。 JavaScript仍然是OO,但这些差异通常会使人们从Java或C#中获取语言。
进一步阅读:https://developer.mozilla.org/en/JavaScript/Reference/Operators/this