gpt4 book ai didi

Javascript 模块模式范围与此

转载 作者:行者123 更新时间:2023-11-28 20:14:34 26 4
gpt4 key购买 nike

我正在使用模块模式进行开发,并且想知道为什么我无法使用它访问模块范围。也许我对揭示模块模式的理解是错误的。

这是我使用的代码:

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

})();

最佳答案

this 由函数的调用方式决定。如果直接调用它,而不是通过对象属性(如外部作用域函数那样),则在该调用中 this 将是松散模式下的全局对象(严格模式下的 undefined )。在浏览器上,这就是 window 对象。

您通常不会使用 this 来尝试引用最外层作用域函数内的内容(出于这个原因)。

如果有什么事情做到了这一点:

BLOG.Module.init();

...然后在对 init 的调用中,this(不是 _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 和由于调用 _privateMethod 而创建的任何 ajax 成功处理程序都是对最外层定义的变量的闭包范围界定功能。所以你直接引用它们就可以了。

如果“闭包”这个词的用法不熟悉,别担心,closures are not complicated .

<小时/>

旁注:这是一个奇怪的结构:

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 || {};

关于Javascript 模块模式范围与此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19404997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com