您好我在尝试从loadData函数返回一个对象,但我在FF中得到“obj未定义”,在chrome中得到“Uncaught ReferenceError”。我读到如果你声明一个没有前缀的变量“var,则假设成为全球“obj”的范围应该是全局的,应该从json响应中返回数据。我不知道我哪里出错我是Javascript的新手。谢谢所有的帮助。
function loadData()
{.....
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
personInfo=xmlhttp.responseText;
obj = JSON.parse(personInfo);
alert(obj[2].name);
}
};
return obj;//"obj is not defined" in FF and "Uncaught ReferenceError" in chrome
}
<h2>AJAX</h2>
<button type="button" onclick="loadData()">Request data</button>
<div id="myDiv"></div>
....
答案 0 :(得分:4)
那是因为onreadystatechange
函数是异步的。您需要执行以下操作:
function loadData(callback) {
xmlhttp.onreadystatechange=function() {
...
callback(data);
}
}
答案 1 :(得分:1)
您正在从loadData函数返回obj,并且当该函数返回时,尚未定义obj。你需要在回调函数本身中使用obj做一些事情 - 也许将它传递给实际处理并对数据执行某些操作的第三个函数。
答案 2 :(得分:1)
AJAX调用是异步的。代码不会等待响应。它在等待响应时继续执行下一个代码。这意味着return obj
在实际填充数据之前执行。
你应该做的是交出一个“回调”,基本上是一个在收到数据时执行的函数:
function loadData(callback){
...
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//execute callback, passing it the parsed JSON
callback(JSON.parse(xmlhttp.responseText));
}
}
//execute send here
}
//call loadData, passing it a callback function
//this function will be executed when response is received
//and the data will be provided as "returnedData"
loadData(function(returnedData){
//use data
alert(returnedData[2].name);
});