javascript类作用域和匿名函数

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

我声明了一个javascript类,如下所示。。我的问题是aonymous函数看不到类的范围。我无法从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回调函数中引用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?奇怪,我认为nk
global
应该用来存储对
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()
         {
         }
      }
   }
})()