2013-06-24 3 views
2

나는 도서관 차트 인력거에 대한 소스 코드를 읽어 봤는데 나는이 조각을 발견 :Javascript에서이 네임 스페이스 기능은 무엇을합니까?

var Rickshaw = { 

    namespace: function(namespace, obj) { 

     var parts = namespace.split('.'); 

     var parent = Rickshaw; 

     for(var i = 1, length = parts.length; i < length; i++) { 
      var currentPart = parts[i]; 
      parent[currentPart] = parent[currentPart] || {}; 
      parent = parent[currentPart]; 
     } 
     return parent; 
    }, 
    ... 

지금 나는이 네임 스페이스 지정에 대한 개체 리터럴 표기법은 이해합니다. 각각의 '모듈'정의 될 때

은 나중에, 다음 구문이 사용됩니다

Rickshaw.namespace('Rickshaw.Graph'); 

Rickshaw.Graph = function(args) { 
... 

누군가는 여기에 무슨 일이 일어나고 있는지 설명해 주시겠습니까. 없이

Rickshaw.Something.AnotherThing : 단지 내가 그렇게 우리가 뭔가를 정의 할 수 있습니다했다 추측에는 요 펀트을해야한다면 다음은?

Rickshaw.Graph = function(args) { 
... 

완벽하게 합법적 인 작성할 때 왜 그들은 namespace 기능을 필요합니까 우리가 Rickshaw.Something을 아직 정의했는지 걱정.

이것이 일반적인 방법입니까?

+0

나는 당신에게 후자에 동의한다. 나는 많은 코드를 저장했기 때문에 그것을 확실히 할 것이다. – simonzack

답변

2

Rickshaw.Graph의 경우 namespace 함수 호출이 필요하지 않습니다. 그러나이 유형의 namespace 함수는 Rickshaw.Graph.Foo을 정의하는 코드가 아직로드되지 않은 더 깊은 네임 스페이스 (Rickshaw.Graph.Foo.Bar)에 유용합니다.

namespace 함수 호출은 여전히 ​​관례 얕은 네임 스페이스에 포함됩니다 - 대신, 다음 변경을하는 사람이를 namespace 전화를 확인하고 업데이트합니다, Rickshaw.GraphRickshaw.Display.Graph를 호출 할 리팩토링되는 경우, 오류를 방지하는 데 도움이 그것을 추가하는 것을 잊지 않아야합니다.

귀하의 최종 질문은 (일반적입니다) - 말하기 어렵습니다. 많은 프로젝트에는 자바 스타일의 네임 스페이스가 필요하기 때문에 별개의 구성 요소가 많지 않습니다. 이 아이디어는 인력거 이상에 분명히 존재합니다. 예를 들어 ExtJS는 동일한 작업을 수행하는 Ext.ns()입니다.

-1

Rickshaw.Something.AnotherThing 당신이 아직 'Something'을 정의하지 않았기 때문에 TypeError가됩니다.

당신은이 네임 스페이스 기능은 아마도 위를 작성할 필요에서 당신을 방지하기 위해 단지 도우미

if (typeof Rickshow !== "undefined" && Rickshow !== null) { 
    Rickshow; 
} else { 
    if (Rickshow.Something == null) { 
    Rickshow.Something = {}; 
    } 
}; 
Rickshow.Something.AnotherThing = {}; 

처럼 뭔가를해야 할 것입니다.

관련 문제