2013-08-09 4 views
0

전역 네임 스페이스를 정의하는 방법이 있으므로 모든 내 페이지에서이 네임 스페이스의 함수를 호출 할 수 있습니까?자바 스크립트에서 전역 네임 스페이스를 정의하는 방법

예를 들어, 하나 개의 파일에 내가

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

// 내가 구현하는 방법이

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

할 수있는 또 다른 자바 스크립트 파일에 있도록 코드 아래 정의 //

" DefineNameSpace "메서드?

감사

매우 간단 그것을 할
+0

는 http://stackoverflow.com/questions/881515/javascript-namespace-declaration –

+0

HTTP의 반복처럼 보인다 : // elegantcode .com/2011/01/26/basic-javascript-part-8-namespaces/ –

답변

3

하나의 방법은 이것이다 : 당신이 실제로 객체를 생성하고 그러나이 방법으로는 네임 스페이스로 단지뿐만 아니라 작동합니다

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

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

:)

흠 구현하는 방법이 아닙니다. 그러나 메서드를 사용하여 네임 스페이스를 작성하려면 네임 스페이스를 사용하는 위치에서 스크립트 파일을로드하기 전에 함수를 호출해야합니다. 그렇지 않으면 DefineNamespace 메서드가 호출되기 전에 해당 코드 줄이 호출되고 네임 스페이스의 일부로 실행됩니다. 그 시점에서 정의되지 않습니다. 불행하게도 역동적이지는 않지만 위의 솔루션은 그렇지 않을 것입니다. 동적으로 다음과 같은 방법으로 수행 할 수있는 공간 구축

+0

그래서 글로벌 var와 비슷합니까? – jojo

+0

예, 그 아이디어입니다. 또한 함수를 사용하여 네임 스페이스를 작성하는 방법을 알려 드리겠습니다. –

+0

@shrimpy - "is like"가 아니라 "is"입니다. JavaScript에는 네임 스페이스 개념이 없습니다. – Quentin

1

:

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

유일한 방법은이 방법으로 만든 네임 스페이스가이 메서드를 호출 한 후에 만 ​​사용할 수 있다는 것입니다. 네임 스페이스를 사용하는 다른 파일/스크립트 블록이이 메서드가 포함 된 스크립트 블록과 함께로드되는 경우 오류가 발생하므로 해당 문제를 피하기 위해 무엇인가를 고려해야합니다. –

관련 문제