javascript类范围和匿名函数

时间:2011-10-20 10:37:54

标签: javascript methods dojo scope anonymous-methods

我有一个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()
         {
         }
      }
   }
}

2 个答案:

答案 0 :(得分:2)

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,例如。 $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()
         {
         }
      }
   }
})()