2

您好,我正在尝试从 loadData 函数返回一个对象,但我在 FF 中得到“obj is not defined”,在 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>

....
4

3 回答 3

4

那是因为onreadystatechange函数是异步的。您需要执行以下操作:

function loadData(callback) {
  xmlhttp.onreadystatechange=function() {
    ...
    callback(data);
  }
}
于 2012-04-29T01:30:00.357 回答
1

您正在从 loadData 函数返回 obj ,并且当该函数返回时 obj 尚未定义。您需要在回调函数本身中对 obj 做一些事情——也许将它传递给第三个函数,该函数实际处理数据并对数据做一些事情。

于 2012-04-29T01:31:53.117 回答
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);
});
于 2012-04-29T01:33:40.713 回答