为什么 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) 回调函数成功执行之前执行,并将值设置为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
将在将来某个不确定的时间点执行(即,在请求完成并success
调用并执行回调之后),在 line11
执行之后。
Ajax 异步运行。JavaScript 发出请求并在等待请求完成的同时继续执行其他代码。这意味着您不能依赖请求何时完成,甚至它是否会完成。因此,所有依赖于 ajax 调用结果的工作都必须在 ajax 回调中完成。您根本不能依赖 ajax 回调内部发生的任何事情随时对回调之外的任何事情产生影响。