2012-02-22 96 views
3

我使用JSON工作,我想計算響應中元素的數量。函數中變量的JS可見性

$.getJSON("/api/getEvents", function(data) { 
     $.each(data, function(key, event) { 
      var count = 10; 
      $.getJSON("/api/getUsers", function(data) { 
       $.each(data, function(key, event) { 
        alert("Value: " + count); 
        count++; 
       }); 
      }); 
      alert("Count: " + count); 
     }); 
    }); 

其結果是,我得到:

Value: 10 
Value: 11 
Value: 12 
... 
Count: 10 

爲什麼數= 10?

+0

我不太確定,這就是爲什麼我沒有發佈這個答案,但我相信在$ .getJSON中創建了一個閉包,它只捕獲對變量計數的引用。 – helpermethod 2012-02-22 08:46:10

+0

它看起來像來自'getUsers'調用的'data'是一個空數組。你設置爲10,你增加零次,然後它提醒計數:10. – 2012-02-22 08:47:23

+0

@ BenLee不,數組不是空的。我可以從數據中獲得元素的價值。 – 2012-02-22 08:51:06

回答

3

這是因爲ajax請求是異步的。 $.getJSON只是啓動一個請求,但JavaScript執行立即繼續。你可以看到計數如果移動警報Ajax回調中:

$.getJSON("/api/getEvents", function(data) { 
    $.each(data, function(key, event) { 
     var count = 10; 
     $.getJSON("/api/getUsers", function(data) { 
      $.each(data, function(key, event) { 
       alert("Value: " + count); 
       count++; 
      }); 

      // I moved this here: 
      alert("Count: " + count); 
     }); 
     // It used to be here. 
    }); 
}); 

所以你設置var count = 10之後,JavaScript分析器,然後運行$.getJSON,但隨後立即繼續到下一行,在你的代碼示例提醒「Count:10」。然後,只要請求完成,它就會運行回調代碼,以增加計數並提醒Value行。

+0

這就是我最初的想法,但在問題中,警報不在你說的地方。它實際上已經在getJSON回調中。 – joidegn 2012-02-22 09:04:07

+0

@Joi,這是一個錯誤的問題。在我問他「價值」項目來自哪裏之後,OP對它進行了修正。 – 2012-02-22 09:04:56

+0

謝謝,我明白了。 – 2012-02-22 09:05:39