返回一个对象javascript

时间:2012-04-29 01:27:45

标签: javascript closures

您好我在尝试从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>

....

3 个答案:

答案 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);
});