【问题标题】:how to define global namespace in javascript如何在javascript中定义全局命名空间
【发布时间】:2013-08-11 02:12:14
【问题描述】:

有没有办法定义全局命名空间,这样我就可以从我所有的页面调用这个命名空间的函数?

例如

// 在一个文件中我定义如下代码

DefineNameSpace("my.namespace.api", { 
    addObject: function(obj) {
         // store obj into indexDB
    },
    readAllObject: function() {
         // return array of object from indexdb
    }
})

// 这样我就可以在另一个 javascript 文件中进行操作了

my.namespace.api.addObject({name: "foo", desc: "bar"});

有没有办法实现“DefineNameSpace”方法?

谢谢

【问题讨论】:

标签: javascript jquery namespaces


【解决方案1】:

一种非常简单的方法是:

my = {
   namespace: {
      api : {}
   }
}

my.namespace.api.addObject = function (obj) { }

您实际上是在创建对象,但这样它也可以用作命名空间 :)

嗯,这不是您正在实施的方法。但是使用方法构建命名空间需要在加载脚本文件之前调用该函数,否则在调用 DefineNamespace 方法之前调用这些代码行,您将遇到部分命名空间在那一点上是未定义的。使用上述解决方案,情况并非如此,尽管不幸的是它不是动态的。

【讨论】:

  • 所以它就像一个全局变量?
  • 是的,就是这样。我还将为您提供一种使用函数构建命名空间的方法。
  • @shrimpy — 不是“像”,只是“是”。 JavaScript 没有命名空间的概念。
  • 请记住 my 的所有内容都是全局的,不仅 my.namespace.api,其他 my.namespace.api2 也将是全局的。不确定我是否理解这个问题,但您只希望 my.namespace.api 是全局的?
【解决方案2】:

可以通过以下方式动态构建命名空间:

// the root of the namespace would still be handy to have declared here
var my = {};

function defineNamespace(namespaceStr) {
   var namespaceSegments = namespaceStr.split(".");
   var namespaceSoFar = null;

   // iterate through namespace parts
   for (var i = 0; i < namespaceSegments.length; i++) {
      var segment = namespaceSegments[i];

      if (i == 0) {
          // if namespace starts with my, use that
          if (segment == "my") { 
              // set pointer to my
              namespaceSoFar = my;
          }
          else {
          // create new root namespace (not tested this, but think this should work)
              var otherNamespace = eval(segment);
              if (typeof otherNamespace == "undefined") {
                 eval(segment + " = {};");
              }
              // set pointer to created root namespace
              namespaceSoFar = eval(segment);
          }  
      }
      else {
          // further build the namespace
          if (typeof namespaceSoFar[segment] == "undefined") {
              namespaceSoFar[segment] = {};
          }
          // update the pointer (my -> my.namespace) for use in the next iteration
          namespaceSoFar = namespaceSoFar[segment];
      }
   }
}

【讨论】:

  • 请记住,唯一的问题是,以这种方式创建的命名空间只有在调用此方法后才能使用。如果使用命名空间的其他文件/脚本块与包含此方法的脚本块一起加载,则会导致错误,因此应考虑避免该问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2012-08-18
  • 2013-12-13
  • 2013-11-19
  • 2016-08-03
  • 1970-01-01
  • 2011-01-15
相关资源
最近更新 更多