我在函数中返回变量时遇到问题,下面的脚本运行正常:
function sessionStatus(){
$(document).ready(function(){
$.getJSON(scriptRoot+"sessionStatus.php",function(status){
alert(status);
});
});
}
sessionStatus();
当我尝试以下操作时,我会收到一个消息框,其中包含“未定义”消息:
function sessionStatus(){
$(document).ready(function(){
$.getJSON(scriptRoot+"sessionStatus.php",function(status){
return status;
});
});
}
alert(sessionStatus());
这真让我烦恼,我似乎无法看清楚我做错了什么。
答案 0 :(得分:12)
你应该知道两件事:
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事物无关):
function do() {
var x = 0;
(function(){
x = 2;
})();
return x;
}
或:
function do() {
var x = (function(){
return 2;
})();
return x;
}
两者都返回2.希望这有点解释。
答案 1 :(得分:2)
您的函数sessionStatus()
不会返回任何内容,因此警告显示undefined
。
一旦页面加载,所有函数都会为AJAX调用设置好事项 - sessionStatus()
中
在对服务器的AJAX调用返回值之前,function(status) { ...}
中的代码不会运行,并且在页面加载之前不会发送该AJAX调用。
你应该仔细阅读$.getJSON()
和$(document).ready()
实际做的事情,因为在你正确理解它们之前,你会继续得到令人困惑的行为。
答案 2 :(得分:1)
您的sessionStatus()函数永远不会返回任何内容。它设置一个稍后运行的函数, 函数返回一些东西,但这与sessionStatus()没有任何关系
答案 3 :(得分:1)
文档就绪事件完成后,您将返回一个值。你应该去哪里? jQuery对象不知道如何处理它。
答案 4 :(得分:1)
函数sessionStatus只为$(document).ready()设置事件监听器,然后返回而不返回值。那是你看到的未定义。
稍后当$(document).ready()触发时会调用ajax,如果成功则返回状态,但没有任何东西正在接收该状态。
答案 5 :(得分:1)
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()调用中声明匿名函数,都是一种风格问题)
答案 6 :(得分:0)
函数永远不应该包含在jQuery(document).ready函数中。将它们分开,这样就不会产生你不想要的副作用。你想如何调用会话状态?巫婆的功能应该得到回报值吗?