我正在开发一个使用twitch API的应用程序,并在此过程中发出两个AJAX请求,一个在另一个内部。我的代码的简化版本:
twitchStreamers = ["name1","name2",...];
var language, views="", html = "";
//var status;
twitchStreamers.forEach(function(streamer) {
// some code
$.getJSON(streamURL, function(streamData) {
var status;
// some code
if(condition){
status = "some value 1";
} else if(condition) {
status = "some value 2";
} else {
status = "some value 3";
}
$.getJSON(channelURL, function(channelData) {
// some code
// access value of status
}) // end of second ajax request
}) // end of 1st ajax request
} //end of forEach loop
注意status
变量。
这种设计与我想要做的完全一致,即当我访问第二个ajax请求中的状态变量时,它具有相对于当前循环迭代的正确值status
。但是当我在forEach循环之外声明变量status
时,它在第二个AJAX请求中访问时始终具有值some value 3
(在条件的else部分初始化)。为什么会这样?
请注意,变量status
始终在第一个AJAX请求中正确初始化,而不管声明变量的位置。
答案 0 :(得分:0)
这是闭包+循环的典型示例。通过将变量status
置于forEach循环之外,我将其声明为一次。随后当循环运行并且第二个函数开始执行时,它引用了它被分配的最新值,即some value 3
。通过将它放在循环中,变量将不仅被声明一次,而是在每次迭代时被声明,从而在每次迭代时存储正确的值status
。