JavaScript、Ajax、Json:如何使用值取决于Json响应的变量?
为什么x在第9行定义时在第11行没有定义JavaScript、Ajax、Json:如何使用值取决于Json响应的变量?,javascript,ajax,json,Javascript,Ajax,Json,为什么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> var x; $.a
<script>
var x;
$.ajax({
dataType: "json",
url: myurl,
success: function(data){
console.log(data);
x = data;
document.write(x);
}
});
document.write(x);
</script>
var x;
$.ajax({
数据类型:“json”,
url:myurl,
成功:功能(数据){
控制台日志(数据);
x=数据;
文件。编写(x);
}
});
文件。编写(x);
这是因为在Ajax(异步)回调函数success执行之前执行第11行
,并将值设置为第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
。但是,行8
将在将来的某个不确定的点执行(即,在请求完成并且调用并执行success
回调之后),在行11
执行之后。因为这里有异步行为。
程序的流程实际上是这样的:
1-您声明x
2-您提出了一个ajax请求
3-将x写入文档(此时,x没有值)
4-ajax请求得到一个响应,您将x的值设置为该响应,并将其写入文档中
您的问题不是范围问题,而是时间问题。Ajax异步运行。JavaScript发出请求并继续执行其他代码,同时等待请求完成。这意味着您不能依赖于请求何时完成,甚至它是否会完成。因此,所有依赖于ajax调用结果的工作都必须在ajax回调中完成。您不能指望ajax回调内部发生的任何事情在任何时候都会对回调外部的任何事情产生影响。Scope与ajax或json无关。应关闭可能的重复项。。。关于这个问题已经有很多。