为什么可以't我在对象文字中访问this.properties
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.myDrop有效的原因-作用域仍然有效。
干杯
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仍然是OO,但这些差异通常会让人们从Java或C#开始使用这种语言。
进一步阅读:https://developer.mozilla.org/en/JavaScript/Reference/Operators/this
- 是否可以将字符串转换为文字对象数组
- jQuery:如何使用文字对象方法中的方法来获取全局变量
- 如何检查文字对象是否在 Javascript 数组中
- Javascript解析序列化的Groovy映射到JS文字对象
- asp.net 文字对象传递给 JavaScript
- 文字对象和jquery选择器DRY
- 将文字/对象/类传递给具有数千次调用的函数的内存含义
- Javascript 文字对象和单例模式
- 如何在 PHP 中将 JavaScript 文字对象转换为 Json 对象
- 将文字对象转换为对象'的属性
- 文字对象中的元素
- 将开关大小写(在c++中)替换为javascript中的文字对象
- 使用函数式编程过滤文字对象
- 关于文字对象,也许还有自动执行函数
- 如何访问“参数”来自闭包的外部函数的文字对象
- 关于文字对象语法的限制
- 在文字对象中创建属性
- JavaScript异步调用文字对象函数
- 文字对象和函数构造函数
- 奇怪的行为和使用Object的多个实例.在文字对象上创建