对不起,如果这已被回答,但我在这里找不到合适的答案。模块化Javascript中的变量范围
我已经开始用模块化风格编写我的JavaScript代码,并且我有一个关于模块变量作用域的问题。
下面的代码给了我一个相互冲突的答案。
我有一个名为Base的模块,声明了两个字符串和一个数组。它还有一个名为fetchData的函数,它使用jQuery getJSON快捷方式将这些变量设置为服务器数据。不幸的是,当我询问Base的string1或string2时,我得到了未定义的。我知道这可能是由于我已经设置了深层的两个函数(在AJAX回调和fetchData内)的值,并且该作用域限制它看不到Base.string1和Base.string2。
但是,当我从模块外部查看Base.array1时,它将设置为从服务器提取的适当数据,即使它的设置与字符串的范围相同。
下面的代码:
namespace.Base = (function(){
var string1, string2, array1 = [];
function fetchData(){
$.getJSON('backendScript.php', function(data){
string1 = data.string1;
string2 = data.string2;
arrayCount = data.arr.length;
for(var i = 0; i<arrayCount; i++){
array1[i] = data.arr[i];
}
})
}
return{
fetchData: fetchData,
string1: string1,
string2: string2,
array1: array1
}
})();
如果我改变
string1 = data.string1;
到
namespace.Base.string1 = data.string1;
它的工作原理是我想要的。
所以我的问题是,为什么array1的设置与字符串的范围相同?
此外,在模块的函数中设置模块级变量而不必提供全局路径(例如namespace.Base.string1)有什么补救措施?
记住要给予好评*所有*答案这对你有帮助。检查哪一个最能解答你的问题。如果没有一个是“值得检查”的,那么只需对所有有帮助的答案进行upvotes。 – 2010-11-04 15:55:25
我是新来的,所以我会尽快获得15点声望。 – Dan 2010-11-05 00:46:58
嗯,好点。欢迎来到Stack Overflow。 – 2010-11-06 23:53:41