簡體   English   中英

如何在javascript中定義全局命名空間

[英]how to define global namespace in javascript

有沒有辦法定義全局命名空間,以便我可以從我的所有頁面調用此命名空間的函數?

例如

//在一個文件中我定義下面的代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM