2012-01-06 65 views
2

有人可以解释它吗?javascript中嵌套匿名函数的变量

  1. 为什么警报1警报2个啪啪?
  2. 为什么警报1页页次的值大于警报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 
} 
+0

怎么把它ASNC呼叫kaleem .. :) – 2014-03-27 11:45:58

回答

1

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

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

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

网络速度很慢。

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

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

+0

它无关,与较慢的网络,但使用JavaScript的单线程性质。无法在alert2之前调用网络时间为零的事件。 – 2012-01-06 19:42:33

2

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

由于同样的原因pageCount不同,当alert2被调用时,没有进行成功回调。

1

ajax函数异步检索给定网址中的数据。这意味着它在后台执行,而其他代码执行。一旦完成,分配给“成功”的功能被称为(或“错误”,如果失败)。

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

1

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

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

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 
}