私は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要求に正しく初期化されていることを
は注意してください。
ループ外に宣言すると、変数が1つしかないため、3つではなく1つの値しか保持できません。 – Bergi
[クロージャの仕組み](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
ここで問題が発生しているのは、http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example?noredirect=1&lq=1に非常によく似ています。答えは有益です –