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という名前の自己実行スクリプトにスコープを注入することはできません。代わりに、スコープを注入するまでスクリプトを保存するために、ある種のエクスポート変数を使用する必要があります。その後

(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); 
}); 

、より包括的なライブラリーローダーなどや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です。

+1

この問題では少し変化しません。 'self'はあらかじめ定義され、' window'オブジェクトを参照します。したがって、彼は別の.jsファイルをロードして実行するので、 'self'は' window'を参照します。 – jAndy

+0

@jAndy私は彼の質問を正しく理解していなかったと思います。 – Matt

関連する問題