0

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>
4

4 に答える 4

5

ここでは非同期の動作があるためです。プログラムの流れは実際には次のようになります。

1-あなたはxを宣言します

2- ajax リクエストを行う

3- ドキュメントに x を書き込みます (この時点では、x には値がありません)。

4- ajax リクエストが応答を取得し、x の値をその応答に設定してドキュメントに書き込みます。

あなたの問題は範囲の問題ではなく、タイミングの問題です。

于 2013-05-16T16:29:56.410 に答える
1

これは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)});
}
于 2013-05-16T16:28:40.637 に答える
1

これは、可変スコープではなく、AJAX が非同期であることに関係しています。制御は、が定義されていない行11にすぐに進みます。xただし、 line8は、 line が実行された後、将来の不確定な時点 (つまり、リクエストが終了し、successコールバックが呼び出されて実行された後) に11実行されます。

于 2013-05-16T16:29:03.670 に答える
0

Ajax は非同期で実行されます。JavaScript はリクエストを作成し、リクエストが完了するのを待っている間、他のコードの実行を続けます。これは、リクエストがいつ完了するか、または完了するかどうに依存できないことを意味します。したがって、ajax 呼び出しの結果に依存するすべての作業は、ajax コールバックで実行する必要があります。ajax コールバックの内部で発生したことが、いつでもコールバックの外部に影響を与えることに依存することはできません。

于 2013-05-16T16:31:51.603 に答える