2016-09-07 13 views
0

私はtwitch APIを使用するアプリケーションを開発しており、このプロセスで2つのAJAX要求を作成します。私のコードの簡易版:Javascriptスコープ:forEachループの外側ではなく内部で宣言された変数

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変数。

このデザインは、2番目のajaxリクエスト内のステータス変数にアクセスするときに、現在のループ反復に対して正確な値statusを持っています。しかし、変数statusをforEachループの外側に宣言すると、2番目のAJAX要求でアクセスされた場合、値は常にsome value 3(条件付きのelse部分で初期化されます)となります。なぜこれはそうですか?変数statusは常にかかわらず、変数が宣言された場合の最初のAJAX要求に正しく初期化されていることを

は注意してください。

+3

ループ外に宣言すると、変数が1つしかないため、3つではなく1つの値しか保持できません。 – Bergi

+2

[クロージャの仕組み](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)について理解していますか?[this](http:// stackoverflow。 com/questions/750486/javascript-closure-inside-loops-simple-practical-example?rq = 1)? – Bergi

+0

ここで問題が発生しているのは、http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example?noredirect=1&lq=1に非常によく似ています。答えは有益です –

答えて

0

これは、クロージャ+ループの典型的な例です。変数statusをforEachループの外側に置くことによって、私はそれを一度宣言していました。その後、ループが実行され、第2の機能が実行を開始すると、それは割り当てられた最新の値、すなわちsome value 3を参照した。ループ内に配置することにより、変数は1回だけでなく各反復で宣言され、それによって各繰り返しで正しい値statusが格納されます。

関連する問題