Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-从函数返回_Javascript_Ajax_Asynchronous_Stack_Stack Overflow - Fatal编程技术网

JavaScript-从函数返回

JavaScript-从函数返回,javascript,ajax,asynchronous,stack,stack-overflow,Javascript,Ajax,Asynchronous,Stack,Stack Overflow,是否需要从JavaScript函数明确返回?在其他语言中,当函数不返回时,我们往往会出现堆栈溢出错误,但JavaScript似乎不是这样 此外,由于异步,有时很难确定函数何时返回。甚至在AJAX调用或jQuery动画完成之前,它们就会返回 例如,函数进行AJAX调用,在返回AJAX结果之前不应返回。问题是,AJAX函数在单独的异步线程中运行。我们如何从这样的函数中返回?不要求从JavaScript函数中明确返回 The trouble is, the AJAX function runs in

是否需要从JavaScript函数明确返回?在其他语言中,当函数不返回时,我们往往会出现堆栈溢出错误,但JavaScript似乎不是这样

此外,由于异步,有时很难确定函数何时返回。甚至在AJAX调用或jQuery动画完成之前,它们就会返回


例如,函数进行AJAX调用,在返回AJAX结果之前不应返回。问题是,AJAX函数在单独的异步线程中运行。我们如何从这样的函数中返回?

不要求从JavaScript函数中明确返回

The trouble is, the AJAX function runs in a separate asynchronous thread. How would we return from such a function?
所有JavaScript函数都将在其作用域结束时返回。如果没有定义return语句,函数将返回undefined。AJAX调用将返回回调并在完成后引发
readystatechange
事件


请参阅:

您似乎对JS的工作原理感到困惑:

函数进行AJAX调用,在返回AJAX结果之前不应返回。问题是,AJAX函数在单独的异步线程中运行

该声明包含两个谬误:

  • 函数进行AJAX调用,在返回AJAX结果之前不应返回
  • AJAX函数在单独的异步线程中运行
  • 这两种说法完全不真实,原因如下:

    一个进行ajax调用的函数就是这样做的:它进行调用,发送请求。AJAX代表异步JavaScript和XML,该函数发出这样的请求,然后在发送请求后返回。发出请求的函数不负责处理请求发生的情况,以及在返回响应后如何处理请求。考虑这一点:

    function sendInfo(info)
    {
        var loader = $('#loader');
        $.ajax({
            url: 'your/url',
            data: info,
            type: 'post',
            success: function(response)
            {//this will get called when there is a response
                loader.hide();//access to outer scope!
            }
        });
        loader.show();
    }
    
    在本例中,
    $。ajax
    是执行请求的函数。如果阻塞了,我们就无法显示加载程序。不过,该函数在发送请求后返回,一旦有响应要处理,就会调用
    success
    回调。该功能将处理加载程序(再次隐藏)。如果AJAX调用被阻塞,我们就不会有像今天几乎所有的站点那样响应迅速、动态的站点(自动完成谷歌搜索,甚至这个站点…)

    AJAX函数在单独的线程中运行是不正确的。AJAX是一种请求类型,您所指的函数要么是发出请求的函数(不在单独的线程中运行),要么是回调/句柄。这些也不会在单独的线程中运行。
    JavaScript是单线程的,而且一直都是单线程的。它有一个事件循环。在每个事件上,JS都会检查是否有绑定到处理该事件的侦听器。如果没有,就到此为止,如果有,这些处理程序将一次调用一个。在调用这些处理程序时,不能执行其他代码

    现在回答你的问题:我们如何从这些函数返回?在某种程度上,你已经做到了:所有函数都会返回一些东西。但我认为你想知道如何将这些函数的返回值赋给一个变量。答案很简单:你不能。不直接,至少:

    //not using jQuery:
    var returnVal = xhr.send();
    
    Will不会返回success(
    onreadystatechange
    )处理程序的值,因为
    onreadystatechange
    事件将发生4次!您可以使用闭包变量、模块模式或全局变量(如果必须的话)。
    如果这些函数在单独的线程中运行,那么作用域和访问全局变量将给您带来许多并发性问题,并且操作DOM将是正确的。相反,您可以这样做:

    var infoModule = (function()
    {
        var loader = $('#loader'),
            module = {response: undefined};
        module.sendInfo = function(info)
        {
            $.ajax({
                url: 'your/url',
                data: info,
                type: 'post',
                success: function(response)
                {//this will get called when there is a response
                    loader.hide();//access to outer scope!
                    module.response = response;
                }
            });
            loader.show();
        };
        return module;
    }());
    
    现在您可以执行以下操作:

    infoModule.sendInfo({data: 'foo'});
    
    请求完成后,您可以获得如下呼叫响应:

    infoModule.response;
    

    谢谢你的回答,格努伊。1.那么,没有溢流风险?2.AJAX响应函数将返回到哪里?产生它的函数在AJAX调用完成后立即返回。据我所知,没有溢出的风险。我对浏览器解释器之类的东西不太了解。如您所述,可以编写函数来进行AJAX调用,并等待AJAX调用返回。此函数称为“回调函数”。AJAX调用将结果返回到此回调函数。阅读更多信息:ajax函数不会在单独的线程中运行。JS是单线程的。一旦触发
    readystatechange
    事件,将调用回调。此时,函数调用被放入调用队列中,以便尽快调用。但是函数本身与代码的其余部分在同一线程中调用,因此是阻塞的。编写一个需要几秒钟才能返回的回调/处理程序,您会注意到它会阻塞UI。如果回调在一个单独的线程中运行,它将无法安全地访问更高的作用域,访问DOM将是有风险的,如果不是不可能的话,谢谢您的澄清!