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

...然后在对init, this(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 回答