如何在javascript中定义全局命名空间

how to define global namespace in javascript

本文关键字:定义 全局 命名空间 javascript      更新时间:2023-09-26

有没有一种方法可以定义全局名称空间,这样我就可以在所有页面上从这个名称空间调用函数?

例如

//在一个文件中,我在下面定义了代码

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"方法吗?

感谢

一种非常简单的方法是:

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

你实际上是在创建对象,但通过这种方式,它也可以作为一个命名空间:)

嗯,这不是你正在实施的方法。但是,使用方法构建命名空间需要在加载脚本文件之前调用函数,在脚本文件中这样使用命名空间,否则在调用DefineNamespace方法之前调用这些代码行,您将遇到当时未定义的部分命名空间。对于上面的解决方案,情况不会是这样,尽管不幸的是它不是动态的。

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

// 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];
      }
   }
}