[英]Javascript: How to modify global variables within functions?
以下是我正在处理的代码。 我想知道为什么,当我更改函数中的变量ttt
时,更改不会停留在函数之外? 我已将其声明为var ttt = new Array;
在最顶端。
另外,为什么我不能在函数中使用变量i
?
码:
client.on('connection', function()
{
var sss;
var aaa;
console.log('Connected');
for (i = 0 ; i < 120 ; i++)
ttt[i] = 0;
for (i = 0 ; i < 9 ; i++)
{
client.getMatchHistory(434582, function(err, result)
{
sss = JSON.stringify(result);
var myObject = eval('(' + sss + ')');
console.log (myObject.object.data[i].object.value);
ttt[myObject.object.data[i].object.value]++;
});
}
for (i = 0 ; i < 120 ; i++)
console.log ("Record" + i + " Successes: " + ttt[i]);
});
正如您所指出的,您的代码存在两个独立的问题,并且它们都有些相关。 首先, ttt
正在全球范围内进行修改。 问题是你在修改之前检查它们。 我怀疑client.getMatchHistory()
正在进行异步调用。 无法保证第二个for
循环中的所有异步操作都将在执行第三个for
循环时执行,在第三个for
循环中读取数组。
第二个问题是范围问题,但问题不在于全球范围。 由于client.getMatchHistory()
是异步的,因此一旦循环执行完毕,就会调用回调。 循环完成后, i
的值为10
。 可能这不是你想要的。 您需要创建一个回调生成函数,它接受i
的值,并返回一个可用作回调的函数。 像这样:
function make_callback(i) {
return function(err, result) {
// The body of your callback in here
};
}
然后你应该在循环体中使用它:
client.getMatchHistory(434582, make_callback(i))
这将捕获当前迭代中i
的值,生成的回调将在执行时使用该值。 这应该解决您的问题i
。
首先,所有全局变量都是有效的“窗口”对象字段,因此您可以使用window.ttt来确保使用全局变量而不是本地变量。 这段代码应该有效,你是否在开发人员工具中尝试过? 调试器对这种变量的存在有何看法?
至于变量i:当然,你可以使用它,但最好在本地使用它,定义'var i;' 在函数的顶部不破坏全局命名空间。
client.getMatchHistory
可能是异步请求,你希望在循环之后,你将填充ttt
数组,为了实现这一点,你必须创建一个在最后一个循环步骤之后运行的处理程序:
var afterloop=function() {
for (var i = 0 ; i < 120 ; i++)
console.log ("Record" + i + " Successes: " + ttt[i]);
}
for (var i = 0 ; i < 120 ; i++)
ttt[i] = 0;
var i_final=0;
for (var i = 0 ; i < 9 ; i++)
{
var i=i; //localise i
client.getMatchHistory(434582, function(err, result)
{
i_final++;
sss = JSON.stringify(result);
var myObject = eval('(' + sss + ')');
console.log (myObject.object.data[i].object.value);
ttt[myObject.object.data[i].object.value]++;
if (i_final>8) {afterloop();}
});
}
在示例中, i_final
计数完成请求,它们可以按随机顺序完成,由于异步,所以在决定运行afterloop()
时,你不能引用i
,当i_final
计数到超过上次执行的请求时,你运行函数应在最后一次请求完成后执行。
注意: 请尽可能少地使用全局变量,在您使用全局i
代码中没有任何理由
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.