2017-11-01 17 views
0
var preGameRequest = new XMLHttpRequest(); 
var preGameData; 

preGameRequest.open("GET", "/matches/live.json"); 
preGameRequest.onload = function() { 
    preGameData = JSON.parse(preGameRequest.responseText); 
} 
preGameRequest.send(); 
console.log(preGameData); // main problem is here 

ここは私のコードです。私はpreGameDataをグローバルとして定義し、/matches/live.jsonファイルのデータをpreGameDataに保存しようとしました。そして、私がconsole.log(preGameData)をスコープの外から(コードセクションのように)しようとすると、返り値として「未定義」になります。私がconsole.log(preGameData)をスコープの内側から試そうとすると、それは動作します。私は何が起こっているのか本当に知りません。Javascriptスコープ変数

+0

非同期JavaScriptのチュートリアルを読むことができます。 – evolutionxbox

答えて

0

つまりコードが動作するはず:

preGameRequest.onload = function() { 
 
    preGameData = JSON.parse(preGameRequest.responseText); 
 
    console.log(preGameData); 
 
}

理由:preGameRequest.send()関数は、非同期を操作することです。

ブラウザがconsole.log()(あなたの例で)を実行しようとすると、http応答はまだ受信されず、変数は実際には未定義です。

しかし、console.log()をハンドラの中に配置すると(私の例のように)、レスポンスがすでに受信されているとき(onload()ハンドラをまっすぐに)に実行されます。それで、変数preGameDataが既に定義されているのです。

関連する問題