【问题标题】:How do you add objects to a javascript namespace?如何将对象添加到 javascript 命名空间?
【发布时间】:2011-03-04 15:27:56
【问题描述】:
var Test = (function() {
    return {
        useSub: function () {
            this.Sub.sayHi();
        },

        init: function () {
            $(document).ready(this.useSub);
        }
    };
})();

Test.Sub = (function () {
    return {
        sayHi: function () {
            alert('hi');
        }
    };
})();

Test.useSub(); // works
Test.init(); // explodes

上面我正在尝试创建一个 Test 命名空间并向其中添加一个对象 Sub。在我尝试在 jQuery 中使用该对象之前,我做得很好。错误是“未捕获的 TypeError:无法调用未定义的方法 'sayHi'”。如果有更好的方法可以做到这一点,我愿意接受。

编辑:

显然这是演示代码。在我的实际应用中,我使用的解决方案是因为我认为最清楚的是这个:

var Namespace (function () {
  return {
    init: function () {
      $(document).ready(function() {
        Namespace.onReady();
      }
    },
    onReady: function() {
      alert('Now I am back in the Namespace scope. Proceed as planned');
    }
  };
})();

Edit2:所有 jQuery 回调似乎都要求以这种方式使用它们,否则范围就会搞砸。

【问题讨论】:

    标签: javascript jquery namespaces


    【解决方案1】:

    这是一种方法

    var Test = {
      useSub : function () { 
        Test.Sub.sayHi(); 
      }, 
      init: function () { 
        $(document).ready(Test.useSub); 
      },
      Sub: {
        sayHi: function () { 
          alert('hi'); 
        } 
      }
    };
    

    【讨论】:

      【解决方案2】:

      我认为这是一个范围问题。如果你这样做了

      $(document).ready(this.useSub);
      

      那么this.useSub将在window范围内执行(所以在函数内部,this指的是window对象)并且不存在Sub属性。

      试试:

      init: function () {
          var obj = this;
          $(function(){obj.useSub()});
      }
      

      由于某种原因,它不能使用 $(document).ready(function(){obj.useSub()});,但它可以使用 $() 快捷方式。

      【讨论】:

      • var that = this; $(document).ready(function () {that.useSub();});为我工作。
      • @Skilldrick:我用 JS Bin 对其进行了测试,但它在那里不起作用,但可能与他们的设置有关。
      【解决方案3】:

      在这一行:

      $(document).ready(this.useSub);
      

      您正在传递对函数的引用并且范围丢失 - 当函数运行时,this 不再意味着 Test

      【讨论】:

        猜你喜欢
        • 2011-03-06
        • 1970-01-01
        • 2013-07-19
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 2013-10-25
        相关资源
        最近更新 更多