Javascript范围:在forEach循环外部声明的变量

时间:2016-09-07 21:09:37

标签: javascript

我正在开发一个使用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请求中正确初始化,而不管声明变量的位置。

1 个答案:

答案 0 :(得分:0)

这是闭包+循环的典型示例。通过将变量status置于forEach循环之外,我将其声明为一次。随后当循环运行并且第二个函数开始执行时,它引用了它被分配的最新值,即some value 3。通过将它放在循环中,变量将不仅被声明一次,而是在每次迭代时被声明,从而在每次迭代时存储正确的值status