x が 9 行目で定義されているのに、11 行目で未定義なのはなぜですか?
<script>
var x;
$.ajax({
dataType: "json",
url: myurl,
success: function(data){
console.log(data);
x = data;
document.write(x);
}
});
document.write(x);
</script>
x が 9 行目で定義されているのに、11 行目で未定義なのはなぜですか?
<script>
var x;
$.ajax({
dataType: "json",
url: myurl,
success: function(data){
console.log(data);
x = data;
document.write(x);
}
});
document.write(x);
</script>
ここでは非同期の動作があるためです。プログラムの流れは実際には次のようになります。
1-あなたはxを宣言します
2- ajax リクエストを行う
3- ドキュメントに x を書き込みます (この時点では、x には値がありません)。
4- ajax リクエストが応答を取得し、x の値をその応答に設定してドキュメントに書き込みます。
あなたの問題は範囲の問題ではなく、タイミングの問題です。
これはline 11
、Ajax(Asynchronous) コールバック関数 success が実行される前に gets が実行され、値が に設定されるためですline 8
。
代わりにこれを行うこともできます。
function MakeAjaxCall(callback)
{
$.ajax({
dataType: "json",
url: myurl,
success: function(data){
console.log(data);
callback(data);
}
});
}
function wantToCallAjaxAndUseResult()
{
MakeAjaxCall(function(x){console.log(x)});
}
これは、可変スコープではなく、AJAX が非同期であることに関係しています。制御は、が定義されていない行11
にすぐに進みます。x
ただし、 line8
は、 line が実行された後、将来の不確定な時点 (つまり、リクエストが終了し、success
コールバックが呼び出されて実行された後) に11
実行されます。
Ajax は非同期で実行されます。JavaScript はリクエストを作成し、リクエストが完了するのを待っている間、他のコードの実行を続けます。これは、リクエストがいつ完了するか、または完了するかどうかに依存できないことを意味します。したがって、ajax 呼び出しの結果に依存するすべての作業は、ajax コールバックで実行する必要があります。ajax コールバックの内部で発生したことが、いつでもコールバックの外部に影響を与えることに依存することはできません。