javascript类作用域和匿名函数
我声明了一个javascript类,如下所示。。我的问题是aonymous函数看不到类的范围。我无法从ajax调用加载回调中引用bb_obj 有办法做到这一点吗 提前谢谢javascript类作用域和匿名函数,javascript,methods,dojo,scope,anonymous-methods,Javascript,Methods,Dojo,Scope,Anonymous Methods,我声明了一个javascript类,如下所示。。我的问题是aonymous函数看不到类的范围。我无法从ajax调用加载回调中引用bb_obj 有办法做到这一点吗 提前谢谢 dojo.declare("sop.quote", null, { bb_obj : new Object, stage1 : function() { dojo.xhrPost( { url : 'go/module_service/transport
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回调函数中引用XHR对象。引用bb_obj
的唯一方法是在与函数相同的范围内直接引用创建的对象。因为对象是通过引用传递的,所以下面的代码按预期工作
注意:为了避免混淆,我使用var bb_obj_obj={}
声明了对象。bb_obj
属性指的是bb_obj\u obj
:
已更改bb_obj_obj.消息
指向bb_obj
,因此bb_obj\u obj
引用相同的变量bb_obj。消息
此
保存在变量中,例如$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实践是将整个过程封装在一个未命名的函数中。此函数的所有局部变量将可供其中声明的每个对象/函数访问。通过立即调用此未命名函数,可以确保函数中的代码得到执行
(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()
{
}
}
}
})()
或者首先创建对
this
的引用:var self=this代码>。更具体:在阶段1内:函数(){
第一行应该是var self=this;
然后你可以做content:self.bb_obj
。这比上面答案中提出的解决方案要好。@gryzzly不使用self
self
已经定义为保存当前窗口的值
对象。@RobW in dojo?奇怪,我认为nkglobal
应该用来存储对window
的引用。不管怎样,然后使用那
也许吧。我个人不喜欢$this
。在名字前面加上$
是突出显示jQuery
对象的惯例(我也不喜欢匈牙利符号)使用Crockford推广的,所以也许使用它是一个好主意。(我个人的偏好是self
,但如果已经使用了,我会使用那
)。语法错误:函数(){}()
至少应该写成:(函数(){})()
。此外,闭包并不重要,因为bb_obj
的前缀不是var
。
(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()
{
}
}
}
})()