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

时间:2012-01-06 16:59:51

标签: javascript

有人可以解释一下吗?

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

5 个答案:

答案 0 :(得分:2)

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

由于同样的原因,pageCount是不同的 - 调用alert2时尚未成功回调。

答案 1 :(得分:2)

由于大多数答案都提到你进行异步调用,但事实并非如此。所以JavaScript是单线程的,每次只能思考。

首先你调用你的函数,这个函数将放在执行上下文堆栈上。在将要添加到堆栈的任何其他函数执行之前,将执行此函数。在此函数中,您可以进行ajax调用,并且在成功时,成功函数将被放在执行上下文堆栈中。所以这个函数永远不会在naviSet之前调用过。当alert1在naviSet函数中生成时,它将首先被调用。

关于你的第二个问题:

从您的功能我认为您相信,当$.ajax()返回true时,您的ajax调用成功并且pageCount已设置为数据。但事实并非如此。 $.ajax不会返回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)

  

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

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

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

网络很慢。

  

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

因为它在收到响应时(就在它被提醒之前)被更改,所以通过与上述相同的回调函数。

答案 3 :(得分:1)

ajax-function从给定的URL 异步中检索数据。这意味着它在后台执行,而其余代码执行。一旦完成,就会调用分配给“成功”的功能(或“错误”,如果失败)。

因此,首先调用第二个警报。就像我说的那样,其余代码在ajax-function工作时继续执行。

答案 4 :(得分:1)

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

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