[英]why can't I access this.property in my object literal?
我刚刚将我的代码重构为对象并使用this关键字,我遇到了这个问题,设置prop工作,但是当第二个方法触发时, 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);
}
}
可能因为当你调用这些函数时, this
不是对象。 this
是调用函数的绑定。
更多代码来演示如何调用函数会很有用,但是你可以通过使用它来使它工作:
myObj.SetProp.call(myObj, id)
这种结合MyObj中为this
,对于SetProp函数调用。
如果你把console.log(this)
放在其中任何一个函数中,你可能会发现this
不是你所期望的。
执行回调函数时,它处于不同的范围。 因此,“this”引用了范围,并且未定义“myProp”。 这就是使用myObj.myProp工作的原因 - 范围仍然有效。
干杯
根据函数的调用方式设置this
变量。 当您使用objectReference.method()
“点”语法this
将自动设置到对象。 您也可以调用一个函数,并明确设定this
使用一些其他物体.call()
或.apply()
在你的情况,当你通过this.SetPropSuccess
为你传递给函数的引用,当它然后被称为一个回调函数GetJSONAfterStandardLogic()
那就不叫在设置方式this
给你的对象(最有可能将等于window
)。 您可以通过在SetProp()
的局部变量中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);
}
}
通过闭包的魔力, 即使在 SetProp()
完成执行 后 ,我作为回调传递给GetJSONAfterStandardLogic()
的匿名函数也可以访问其包含范围SetProp()
的变量。
最重要的是,你必须在JavaScript中习惯this
方式与它在基于类的OO语言(如Java和C#)中的工作方式有很大不同。 JavaScript仍然是OO,但这些差异通常会使人们从Java或C#转向语言。
进一步阅读: https : //developer.mozilla.org/en/JavaScript/Reference/Operators/this
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.