2012-12-14 3 views
0

먼저 네임 스페이스를 정의하는 최상위 네임 스페이스에 정의 모듈 메서드를 추가하려고합니다. 예 :Javascript Define Module 메서드 할당

그러나 내 구현에는 할당 문제가있는 것으로 보입니다. 다음은 구현의 간략한 예입니다.

var APP = APP || {}; 
APP.namespace = function(nsString) { 

    var parts = nsString.split('.'), 
     parent = this, 
     i; 

    if (parts[0] === 'APP') { 
     parts = parts.slice(1); 
    } 

    for (i = 0; i < parts.length; i++) { 
     if (typeof parent[parts[i]] === 'undefined') { 
      parent[parts[i]] = {}; 
     } 
     parent = parent[parts[i]]; 
    } 

    return parent; 
}; 

// Simplified example of my define function 
APP.define = function(name, definition) { 
    var namespace = APP.namespace(name); 

    namespace  = definition(); 
    return namespace; 
}; 

// Example Module 
APP.define('modules.example', function() { 

    return { 
     name : 'Application', 
     module : 'APP.module' 
    }; 
}); 

그러나 이름 공간이 definition()에 할당 된 후 APP 네임 스페이스에 할당되지 않은 것처럼 보입니다. 그러나 var module = APP.define('module.example', function() { /*...*/ })가 작동합니다. 이것은 또한 작동합니다 :

개체 참조 또는 콜백 범위에 대해 뭔가가 있어야합니다. 누락되었습니다.

답변

0

APP.namespace (name)에 var namespace를 할당하면 참조로 네임 스페이스의 마지막 부분을 가져 오지만 namespace = definition()은 네임 스페이스 변수를 definition 함수의 결과로 다시 정의합니다.

병합 할 수 있습니다 APP.namespaceAPP.define 있으므로 사전에 마지막으로 부모가 definition 기능

코드는에 속성으로 네임 스페이스의 마지막 부분을 할당합니다 경우

var APP = APP || {}; 
APP.define = function(nsString, definition) { 

    var parts = nsString.split('.'), 
     parent = this, 
     i; 

    if (parts[0] === 'APP') { 
     parts = parts.slice(1); 
    } 

    for (i = 0; i < parts.length - 1; i++) { 
     if (typeof parent[parts[i]] === 'undefined') { 
      parent[parts[i]] = {}; 
     } 
     parent = parent[parts[i]]; 
    } 

    parent[parts.pop()] = definition(); 
}; 
+0

아마 '필요 (parts.length === 0) return;'if (parts [0] === 'APP') ..'코드의 일부분이지만 그 것이 세부 사항이다. – artygus