- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
很抱歉,如果这个问题已经得到解答,但我无法在这里找到合适的答案。
我最近开始以模块化风格编写我的 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)的补救措施是什么?
最佳答案
问题是您实际上有两个不同的引用,变量 string1
在您调用以创建 namespace.Base
的匿名函数的闭包中,以及 namespace.Base.string1
,它位于从该匿名函数返回的对象上。您将变量 string1
分配给对象属性 string1
是一次性设置,而不是实时引用。进一步修改变量 string1
不会影响对象属性。这就是你想要的:
namespace.Base = (function() {
var my = {
string1: null,
string2: null,
array1: [],
fetchData: function () {
$.getJSON('backendScript.php', function(data){
my.string1 = data.string1;
my.string2 = data.string2;
var arrayCount = data.arr.length;
for (var i = 0; i < arrayCount; i++){
my.array1[i] = data.arr[i];
}
});
}
};
return my;
})();
现在 namespace.Base
的本地但公共(public)的成员位于对象 my
中。您可以在匿名函数中使用 var
创建私有(private)变量,或者通过将它们添加到 my
来创建更多公共(public)属性。
关于javascript - 模块化 Javascript 中的变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093720/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!