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) 回调函数成功执行之前执行,并将值设置为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将在将来某个不确定的时间点执行(即,在请求完成并success调用并执行回调之后),在 line11执行之后。

于 2013-05-16T16:29:03.670 回答
0

Ajax 异步运行。JavaScript 发出请求并在等待请求完成的同时继续执行其他代码。这意味着您不能依赖请求何时完成,甚至它是否会完成。因此,所有依赖于 ajax 调用结果的工作都必须在 ajax 回调中完成。您根本不能依赖 ajax 回调内部发生的任何事情随时对回调之外的任何事情产生影响。

于 2013-05-16T16:31:51.603 回答