3

このモジュールがあり、それを自己初期化してそのスコープにアタッチしたいとします。そのようです:

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

さて、問題は、それselfが常にであるということwindowです。私はそれを望んでいません。$.getScript()次のように、jQueryによって呼び出されて読み込まれるスコープにしたいと思います。

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

これをクラックする方法はありますか?

4

2 に答える 2

3

$.getScriptで呼び出される自己実行スクリプトにスコープを挿入することはできないと思います。代わりに、スコープが挿入されるまでスクリプトを格納するために、ある種のエクスポート変数を使用する必要があります。

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

それで:

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

正直なところ、このようなモジュールパターンにjQueryを使用している場合は、require.jsFrame.jsなどのより包括的なライブラリローダーの使用を検討してください。

于 2012-04-18T13:01:24.990 に答える
0

JavaScriptのスコープは、オブジェクトではなく関数と密接に関連しています。JSのオブジェクトは、{}独自のスコープを作成しません。私はjQueryの「RevealingModulePattern」に精通していませんが、一意のスコープを取得するには、次のようにします。

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

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

})();

または、おそらくもっと簡潔に:

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

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

})();

この場合、スコープはウィンドウではなくモジュールです。

于 2012-04-17T15:09:53.450 に答える