我有一个如下所示声明的 javascript 类。我的问题是匿名函数看不到该类的范围。我无法从 ajax 调用加载回调中引用 bb_obj。
有没有办法做到这一点?
提前致谢..
dojo.declare("sop.quote", null,
{
bb_obj : new Object,
stage1 : function()
{
dojo.xhrPost(
{
url : 'go/module_service/transport.php',
content : this.bb_obj,
handleAs : 'xml',
load : function(xml)
{
var status = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue;
this.bb_obj.message = message;
},
error : function()
{
}
}
}
}
最佳答案
XHR 回调函数中的
this
指的是 XHR 对象。引用 bb_obj
的唯一方法是直接引用创建的对象,在与函数相同的范围内。因为对象是通过引用传递的,所以下面的代码按预期工作。
请注意,为避免混淆,我使用 var bb_obj_obj={}
声明了对象。 bb_obj
属性引用 bb_obj_obj
:
bb_obj_obj.message
已更改bb_obj
指向bb_obj_obj
,因此bb_obj.message
指的是同一个变量
代码:
var bb_obj_obj = {}; //new Object
dojo.declare("sop.quote", null,
{
bb_obj : bb_obj_obj,
stage1 : function()
{
dojo.xhrPost(
{
url : 'go/module_service/transport.php',
content : this.bb_obj,
handleAs : 'xml',
load : function(xml)
{
var status = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue;
bb_obj_obj.message = message; //Without `this`
},
error : function()
{
}
}
}
}
另一种方法是将 this
保存在一个变量中,例如。 $这个
:
...
stage1 : function()
{
var $this = this;
dojo.xhrPost({
...
load : function(xml){
var status = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue;
$this.bb_obj.message = message; //Using `$this` instead of `this`
},
...
关于javascript类范围和匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7834693/