0

モジュールパターンを使って開発していたのですが、これを使ってモジュールスコープにアクセスできないのはなぜだろうと思っていました。明らかにモジュールパターンの理解が間違っているのかもしれません。

ここに私が使用するコードがあります:

var BLOG = window.BLOG || {};

BLOG.Module = (function(){

    var 
        _this = this,
        _hasLoaded = false;


    function init(){
        console.log(_this); // Logs the Window object

    }


    function _privateMethod(){
        $.ajax({
            url: 'lazyload/lazyload.html',
            success : function( data ){
                // _hasLoaded = true; // I want to access the variable in my module, How do I refer to it? 
            }

        });
    }


    return {
        init : init
    };

})();
4

1 に答える 1

3

this関数の呼び出し方法によって決まります。オブジェクトプロパティを介してではなく(外部スコープ関数のように)直接呼び出された場合、その呼び出し内thisでルースモード(undefined厳密モード)のグローバルオブジェクトになります。ブラウザーでは、それは window オブジェクトです。

通常、最も外側のスコープ関数内のものを参照しようとすることはありませんthis(このため)。

何かがこれをした場合:

BLOG.Module.init();

...次に、への呼び出し内でinitthis(not _this) が参照されModule、最も外側のスコープ関数の最後に作成したオブジェクトの他のプロパティを参照できます (現在、他にはありません。 だけですinit)。


あなたの編集を再:

var 
    _this = this,
    _hasLoaded = false;

// ...

function _privateMethod(){
    $.ajax({
        url: 'lazyload/lazyload.html',
        success : function( data ){
            // _hasLoaded = true; // I want to access the variable in my module, How do I refer to it? 
        }

    });
}

その行のコメントを外してください:

_hasLoaded = true;

これは_privateMethod、呼び出しの結果として作成された ajax 成功ハンドラーの両方_privateMethodが、最も外側のスコープ関数内で定義された変数に対するクロージャーであるためです。したがって、それらを直接参照するだけです。

この「閉鎖」という言葉の使用になじみがない場合でも、心配しないでください。閉鎖は複雑ではありません


補足: これは奇妙な構造です:

var BLOG = window.BLOG || {};

...グローバル スコープにある必要があるコードと、グローバル スコープにある必要がないコードが混在しているためです。それは完全に機能的ですが、少し奇妙です。私はおそらくどちらかの方法で行きます:

// Requires that it's at global scope (and yes, this does work)
var BLOG = BLOG || {};

また

// Creates a global whether it's at global scope or not
window.BLOG = window.BLOG || {};
于 2013-10-16T13:40:04.210 に答える