javascript中嵌套匿名函数中的变量

javascript中嵌套匿名函数中的变量,javascript,Javascript,谁能解释一下吗 为什么警报2在警报1之前弹出 为什么警报1中的页面计数的值与警报2不同 为什么警报1之前会出现警报2 警报1由回调函数触发,该函数在收到成功的HTTP响应时触发 HTTP请求发送后立即触发警报2 网络很慢 为什么警报1中的pageCount值不同于警报2 因为它是在收到响应时(就在发出警报之前)由上述相同的回调函数更改的。警报1位于回调中-只有在ajax请求成功完成时(即异步)才会调用此函数 页面计数不同的原因相同-调用alert2时未进行成功回调。ajax函数从给定url异步检

谁能解释一下吗

  • 为什么警报2在警报1之前弹出
  • 为什么警报1中的页面计数的值与警报2不同
  • 为什么警报1之前会出现警报2

    警报1由回调函数触发,该函数在收到成功的HTTP响应时触发

    HTTP请求发送后立即触发警报2

    网络很慢

    为什么警报1中的pageCount值不同于警报2


    因为它是在收到响应时(就在发出警报之前)由上述相同的回调函数更改的。

    警报1位于回调中-只有在ajax请求成功完成时(即异步)才会调用此函数


    页面计数不同的原因相同-调用alert2时未进行成功回调。

    ajax函数从给定url异步检索数据。这意味着它是在后台执行的,而其余的代码则在执行。一旦完成,将调用分配给“成功”的函数(如果失败,则调用“错误”)


    因此,第二个警报称为第一个警报。正如我所说,当ajax函数工作时,其余代码继续执行。

    第二个警报首先出现的原因是
    ajax
    调用是异步的。它本质上是安排一个web调用并立即返回。因此,它之后的第二个警报行直接发生在它之后


    稍后,web请求将完成并调用
    success
    函数。因此,第一个警报发生在该点,因为大多数答案都提到您进行了异步调用,但这并不是真正的原因。所以JavaScript是单线程的,每次只能进行一次思考

    因此,首先调用函数,该函数将放在执行上下文堆栈上。此函数将在添加到堆栈的任何其他函数可以执行之前执行。在这个函数中,您进行ajax调用,一旦成功,success函数将被放在执行上下文堆栈上。因此,以前从未调用过此函数
    naviSet
    。由于alert1是在
    naviSet
    函数中生成的,因此它将首先被调用

    关于你的第二个问题:

    从您的函数来看,我认为您相信,当
    $.ajax()
    返回
    true
    时,您的ajax调用是成功的,
    pageCount
    被设置为data。但事实并非如此<代码>$。ajax不返回true,而是返回truethy值
    $
    。它是一个函数,它返回对主jquery对象的引用,这样您就可以链接函数调用

    函数naviSet()


    它与慢速网络无关,而是与JavaScript的单线程特性有关。网络时间为零的事件在alert2之前无法调用它。因为它的asnc调用kaleem:)
    function naviSet()
    {
        var pageCount;
        if($.ajax({
            type: "POST",
            url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php",
            success:function(data)
            {
                pageCount = data;
                alert(pageCount); //alert 1
                return true;
            },
            error:function()
            {
                $("#direction").html("Unable to load projects").show();
                return false;
            }
        })) alert(pageCount); //alert 2
    }
    
    {
        //you create a new var which is undefined
        var pageCount;
        // return $ which is a truethy in JavaScript, but it does not mean the ajax call was successful
        if($.ajax({
            type: "POST",
            url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php",
            success:function(data)
            {
                // now you in the context of your success function 
                // and set the value of your   variable to data
                pageCount = data;
                alert(pageCount); //alert 1
                return true;
            },
            error:function()
            {
                $("#direction").html("Unable to load projects").show();
                return false;
            }
    
        })) 
        //here you are still in the context of your naviSet function where pageCount is undefined
        alert(pageCount); //alert 2
    }