JavaScript var 外部函数

JavaScript var outside function

如何在 fn() 函数外检索 returndata 变量?

function fn() {
    var xmlhttp = new XMLHttpRequest();
    var vars = "request=something";

    xmlhttp.open("POST", "script.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var returndata = xmlhttp.responseText;
        }
    }

    xmlhttp.send(vars);
}

你需要在函数之前定义全局变量,然后将结果存储到这个变量中。你现在的做法是局部变量的定义。

var returndata;
function fn() {
    var xmlhttp = new XMLHttpRequest();
    var vars = "request=something";

    xmlhttp.open("POST", "script.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            returndata = xmlhttp.responseText;
        }
    }

    xmlhttp.send(vars);
}

AJAX 请求是异步的。在烘烤之前你不能吃披萨。在现实生活中,你打电话给披萨公司。他们烤它,你等着。 AJAX 是一样的。所以设置 returndata 不会自己完成。

function fn() {
    var xmlhttp = new XMLHttpRequest();
    var vars = "request=something";

    xmlhttp.open("POST", "script.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var returndata = xmlhttp.responseText;
        }
    }

    xmlhttp.send(vars);
}       

readystate 函数不是无用的。它一直等到请求被处理。从那里你可以继续。每个依赖于返回数据的 function/script 都应该从该函数调用。

你仍然可以这样做:

    var returndata; //this will now be a global variable.
function fn() {
    var xmlhttp = new XMLHttpRequest();
    var vars = "request=something";

    xmlhttp.open("POST", "script.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var returndata = xmlhttp.responseText;
            doSomeThing(); //fire depended value.
        }
    }

    xmlhttp.send(vars);
}

function doSomething()
{
    if(returndata)
    {
         //do Something
    }
    else
    {
        alert("Data isn't loaded yet");
    }
}