javascript函数返回不工作

javascript函数返回不工作,javascript,function,return,Javascript,Function,Return,我在函数中返回变量时遇到问题,下面的脚本工作正常: function sessionStatus(){ $(document).ready(function(){ $.getJSON(scriptRoot+"sessionStatus.php",function(status){ alert(status); }); }); } sessionStatus(); 打赌当我尝试以下操作时,我会收到一个消息框,消息为“und

我在函数中返回变量时遇到问题,下面的脚本工作正常:

function sessionStatus(){
    $(document).ready(function(){
        $.getJSON(scriptRoot+"sessionStatus.php",function(status){
            alert(status);
        });
    });
}

sessionStatus();
打赌当我尝试以下操作时,我会收到一个消息框,消息为“undefined”:


这真的让我很烦,我只是看不出我做错了什么。

您的函数
sessionStatus()
没有返回任何内容,因此警报显示
未定义

该函数所做的一切就是设置AJAX调用在页面加载后发生—在
sessionStatus()中实际上没有任何可以返回的事情发生

function(status){…}
中的代码在对服务器的AJAX调用返回值之前不会运行,而该AJAX调用在页面加载之前不会发送


您应该仔细阅读
$.getJSON()
$(document).ready()
实际上做了什么,因为在您正确理解它们之前,您将继续遇到令人困惑的行为。

您的sessionStatus()函数永远不会返回任何内容。它将一个函数设置为稍后运行,该函数将返回一些内容,但这与sessionStatus()无关。

当document ready事件完成时,您将返回一个值。你的价值应该去哪里?jQuery对象不知道如何处理它

函数sessionStatus只为$(document).ready()设置事件侦听器,然后返回而不返回值。这就是你看到的未定义的

稍后,当$(document).ready()触发时,它调用ajax,如果成功,ajax将返回状态,但没有任何内容接收到该状态

function sessionStatusCallback(status)
{
    alert(status);
}

function sessionStatus(){
    $(document).ready(function(){
        $.getJSON(scriptRoot+"sessionStatus.php",function(status){
                sessionStatusCallback(status);
        });
    });
}

sessionStatus();
正在异步调用您的函数——实际上是在通过.ready()和.getJSON()进行两次异步调用之后。在这种情况下,没有可用的返回值,而是必须使用回调(如上所述)来处理响应


尽管我应该注意,上面传递给getJSON的函数已经是回调函数了。您可以将该函数定义更改为“sessionStatusCallback”,一旦JSON就绪,它将调用上述回调,您可以继续在那里进行处理。或者…在当前回调中继续处理(使用函数引用还是在.getJSON()调用中声明匿名函数是风格问题)

函数永远不应该包含在jQuery(document).ready函数中。将它们分开,这样你就不会产生你不想产生的副作用。您希望如何调用会话状态?witch函数应该得到返回值吗?

有两件事你应该知道:

1:JSON是异步的,因此在仍然获取JSON时,可以已经完成对sessionStatus的函数调用。以下将起作用:

function sessionStatus(callback){
    $(document).ready(function(){
        $.getJSON(scriptRoot + "sessionStatus.php", function(status){
                callback(status);
        });
    });
}
sessionStatus(function(s){alert(s);});
或者更确切地说:

function sessionStatus(callback){
    $(document).ready(function(){
        $.getJSON(scriptRoot + "sessionStatus.php", callback);
    });
}
sessionStatus(function(s){alert(s);});
2:即使是同步的,您也只从内部函数中给出一个返回值,因此sessionStatus不会返回任何内容。查看以下代码(与JSON无关):

或:


两者都返回2。希望这能解释一点。

那么“返回状态”是什么呢?很抱歉,这让我更加困惑。它正在返回状态,但在http请求完成时,它位于由.getJSON调用的匿名函数中。它不是sessionStatus()范围内的返回状态@斯坦尼:返回状态是向JSON回调的调用者返回一个值,即jQuery本身。jQuery将直接丢弃它。你的代码不是一个函数;它是一个函数,其定义嵌套在一个函数中,而函数本身嵌套在另一个函数中。这三个函数都在不同的时间调用,以响应不同的事件。
function sessionStatus(callback){
    $(document).ready(function(){
        $.getJSON(scriptRoot + "sessionStatus.php", callback);
    });
}
sessionStatus(function(s){alert(s);});
function do() {
    var x = 0;
    (function(){
       x = 2;
    })();
    return x;
}
function do() {
    var x = (function(){
       return 2;
    })();
    return x;
}