我有一个javascript类声明如下所示。我的问题是匿名函数没有看到类的范围。我无法在ajax调用load callback中引用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()
{
}
}
}
}
答案 0 :(得分:2)
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
,例如。 $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`
},
...
答案 1 :(得分:0)
在这种情况下,典型的Javascript实践是将整个事物包装在一个未命名的函数中。该函数的所有局部变量都可以被其中声明的每个对象/函数访问。通过立即调用这个未命名的函数,您可以确保函数内的代码被执行。
(function() {
var bb_obj = {}
dojo.declare("sop.quote", null, {
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.message = message;
},
error : function()
{
}
}
}
})()