为什么在第9行中定义的x未定义为第11行?
<script>
var x;
$.ajax({
dataType: "json",
url: myurl,
success: function(data){
console.log(data);
x = data;
document.write(x);
}
});
document.write(x);
</script>
答案 0 :(得分:5)
因为你在这里有异步行为。 你的程序流程实际上是这样的:
1-你宣布x
2-您发出ajax请求
3-您将x写入文档(此时,x没有值)
4- ajax请求获得响应,并将x的值设置为该响应并将其写入文档。
你的问题不是范围问题,而是时间问题。
答案 1 :(得分:1)
这是因为在{Ajax(异步)回调函数成功执行之前执行line 11
并将值设置为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)});
}
答案 2 :(得分:1)
这更多地与AJAX是异步的,而不是变量范围。控件立即进入行11
,其中未定义x
。但是,在8
行执行后,行success
将在未来的某个不确定点执行(即,在请求完成并调用并执行11
回调之后)。
答案 3 :(得分:0)
Ajax以异步方式运行。 JavaScript发出请求并在等待请求完成时继续执行其他代码。这意味着,当请求完成时,您无法依赖,如果, 将完成。因此,所有依赖于ajax调用结果的工作必须在ajax回调中完成。你根本不能依赖于ajax回调中发生的任何事情,它会随时对回调之外的任何事情产生影响。