【问题标题】:javascript function return not workingjavascript函数返回不起作用
【发布时间】:2010-12-16 11:47:00
【问题描述】:

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

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());

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

【问题讨论】:

    标签: javascript function return


    【解决方案1】:

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

    该函数所做的只是为页面加载后发生的 AJAX 调用进行设置 - 实际上没有任何事情发生 sessionStatus() 可以返回。

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

    您应该阅读 $.getJSON()$(document).ready() 的实际作用,因为在您正确理解它们之前,您将继续获得令人困惑的行为。

    【讨论】:

    • 那么什么是“返回状态;”那时在做什么?抱歉,这让我更加困惑。
    • 它正在返回状态,但它在 http 请求完成时由 .getJSON 调用的匿名函数内。不是 sessionStatus() 范围内的返回状态;
    • @Stanni: return status 正在向 JSON 回调的调用者返回一个值,即 jQuery 本身。 jQuery 将简单地丢弃它。您的代码不是一个功能;它是一个函数,其定义嵌套在一个函数中,而该函数本身又嵌套在另一个函数中。这三个函数都在不同的时间被调用,以响应不同的事件。
    【解决方案2】:

    你的 sessionStatus() 函数永远不会返回任何东西。它设置了一个稍后运行的函数,并且 that 函数返回了一些东西,但这与 sessionStatus() 没有任何关系

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:
          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】:

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

            【讨论】:

              【解决方案7】:

              有两件事你应该知道:

              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。希望这能解释一下。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-03-17
                • 2015-05-31
                • 2012-10-20
                • 2012-04-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多