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

Variables inside nested anonymous functions in javascript

本文关键字:函数 变量 javascript 嵌套      更新时间:2023-09-26

有人能解释一下吗?

  1. 为什么警报2警告1之前弹出
  2. 为什么警报1pageCount的值与报警2不同
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
}

alert1在回调中——只有当ajax请求成功完成(即异步)时,才会调用此函数。

pageCount不同的原因相同-调用alert2时没有进行成功回调。

正如大多数答案所提到的,您进行异步调用,但这并不是真正的原因。所以JavaScript是单线程的,每次只能进行一次思考。

因此,首先调用您的函数,该函数将被放入执行上下文堆栈中。此函数将在执行将添加到堆栈中的任何其他函数之前执行。在这个函数中,您进行ajax调用,成功后,success函数将被放在执行上下文堆栈中。因此,这个函数在naviSet之前永远不会被调用。由于alert1是在naviSet函数中生成的,它将首先被调用。

关于你的第二个问题:

根据您的函数,我想您相信,当$.ajax()返回true时,您的ajax调用成功,pageCount被设置为data。但事实并非如此。$.ajax不返回true,而是返回true值$。它是一个返回对主jquery对象的引用的函数,因此您可以链接函数调用。

函数naviSet()

{
    //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
}

为什么警报2在警报1之前弹出?

当收到成功的HTTP响应时,回调函数会触发警报1。

一旦发送了HTTP请求,就会触发警报2。

网络速度较慢。

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

因为它是在收到响应时(就在收到警报之前)通过上面提到的相同回调函数更改的。

ajax函数异步地从给定的url中检索数据。这意味着它是在后台执行的,而代码的其余部分则执行。一旦完成,就会调用分配给"success"的函数(如果失败,则调用"error")。

因此,首先调用第二个警报。正如我所说,在ajax函数工作的同时,代码的其余部分继续执行。

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

稍后的某个时间点,web请求将完成并调用success函数。因此,第一个警报发生在