3

이 모듈을 가지고 있으며 자체 초기화하고 해당 범위에 연결하려고합니다. 그래서 같이 :jQuery를 사용하여 '모듈 패턴 공개'모듈의 범위 결정

(function(scope) { 
    var Module = (function() { 
     return { 
      init: function(){ 
       console.log('Initialized'); 
      } 
     }; 
    })(); 
    var module = scope.Module = Module; 
    module.init(); 
})(self); 

이제 문제는, self 항상 window 것입니다. 나는 그것을 원하지 않는다. 그래서처럼, 그것은 호출 및 jQuery의 $.getScript()에 의해로드 된 어디의 범위가되고 싶어요 :

var Master = (function($) { 
    return { 
     init: function() { 
      var self = this; 
      $.getScript("/js/libs/module.js"); 
     } 
    } 
})(jQuery) 

이 균열 수있는 방법이 있나요?

답변

3

$ .getScript라는 자체 실행 스크립트에 범위를 주입 할 수 없다고 생각합니다. 대신 범위를 삽입 할 수있을 때까지 스크립트를 저장하기 위해 일종의 export 변수를 사용해야합니다. 그런 다음

(function(exports) { 
    exports.Module = function() { 
    return { 
     init: function(scope){ 
      console.log('Initialized', scope); 
     } 
    }; 
    }; 
    var module = exports.Module; 
})(exports || window.exports = {}); 

:이 같은 모듈 패턴 jQuery를 사용하는 경우 솔직히

var self = this; // or whatever you want the scope to be 
$.getScript("/js/libs/module.js", function(){ 
    exports.Module().init(self); 
}); 

,보다 포괄적 인 라이브러리 로더 등 require.js 또는 Frame.js을 사용하는 것이 좋습니다.

+0

그런데 require.js는 매우 적합하다. 감사. – Kriem

0

JavaScript의 유효 범위는 객체가 아니라 기능과 밀접하게 관련되어 있습니다. JS {}의 객체가 자체 범위를 만들지 않습니다. 내가 jQuery를에서 "밝히려 모듈 패턴 '에 익숙하지 해요,하지만이 같은 것을 할 것 고유의 범위를 얻을이에서

(function(scope) { 
    var Module = new function() { 
     this.init = function(){ 
      console.log('Initialized'); 
     }; 
    }; 

    var module = scope.Module = Module; 
    module.init(); 

})(); 

: 아마도 더 간결

(function(scope) { 
    var Module = (function() { 
     return new function() { 
      this.init = function(){ 
       console.log('Initialized'); 
      } 
     }; 
    })(); 

    var module = scope.Module = Module; 
    module.init(); 

})(); 

또는를, 경우, 범위는 Module이 아닌 Window입니다.

+1

이 문제에 대해 조금 변경되지 않습니다. 'self'는 미리 정의되고'window' 객체를 참조합니다. 그래서 그는 다른 .js 파일을로드하고 실행하기 때문에'self'는'window'를 참조합니다. – jAndy

+0

@jAndy 나는 그의 질문을 올바르게 이해하지 못했다고 생각한다. – Matt