javascript类范围和匿名函数

标签 javascript methods dojo scope anonymous-methods

我有一个如下所示声明的 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/

相关文章:

javascript - 同时使用 onepage-scroll.js 和 scrollReveal.js

javascript - 动态柯里化(Currying),以及如何在 JavaScript 变量中同时保存函数和值

javascript - 渲染函数不渲染任何东西 React Native

java - 方法引用类似于 Scala 中的 Java 8

c# - 如何从另一个页面调用 MainWindow 上的方法

javascript - 页面加载时的缓动效果

c# - 如何制作以 A1A 1A1 格式返回随机字符串的方法?

javascript - 使用 javascript(dojo 或 jquery)在 iframe 中进行 Web 自动化 - 单击 iframe 中的元素

java - 在 Javascript 中获取 userPrincipal

javascript - 如何从 Dojo gridx detailProvider(Dod 模块)获取声明类的引用