为什么这个JavaScript方法返回undefined?

时间:2011-04-13 22:35:36

标签: javascript

在这段代码中这个方法返回undefined despites alert语句打印一个值?

function getNearestPoint(idd) 
        {
            var xmlhttp;
            var result;
            if(window.XMLHttpRequest)
                xmlhttp=new XMLHttpRequest();
            else
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");     
            xmlhttp.onreadystatechange=function()
            {
             if (xmlhttp.readyState==4 && xmlhttp.status==200)
                    {
                        result= xmlhttp.responseText;
                        alert(result);

                    }

            }
            xmlhttp.open("GET","ajax_get_nearest_location.php?id="+idd +"&radius=1",true);
            xmlhttp.send();
            return result;
        }

3 个答案:

答案 0 :(得分:2)

结果未在此时定义,只有在回调执行后才会定义。执行顺序:

  • getNearestPoint开始
  • XHR被解雇
  • getNearestPoint返回undefiend
  • XHR返回并运行xmlhttp.onreadystatechange
  • 结果设置

如果你需要OUTSIDE的结果,你应该使用回调:

getNearestPoint(idd, cb){
   ...
   xmlhttp.onreadystatechange = function(){
      ...
      cb(result);
   }
}

并且您的调用代码更改为:

var result = getNearestPoint(id);

为:

getNearestPoint(id, function(result){
   // do something with result;
});

答案 1 :(得分:0)

这是因为Ajax的异步性(“异步JavaScript和XML”):当您的代码命中return result时,请求仍将继续运行。尚未调用readystatechange回调,并且result变量尚未设置。

处理此问题的常用方法是更改​​脚本的体系结构:直接在result回调中根据onreadystatechange执行您需要执行的操作。 (或者,当然,传递带有所需操作的回调函数并在处理程序中执行它。)

答案 2 :(得分:0)

result设置语句在异步Ajax函数

内执行

因为您的第二个if语句(设置result值)未被命中。为什么不?因为您发送Ajax请求的那一刻,您将返回仍未定义的result值。 Ajax调用稍后将执行匿名函数并设置很久以前返回的result变量。

Ajax是异步的,您的代码没有考虑到这一点。