2012-06-05 69 views
0

我想在jQuery中使用匿名函數在JavaScript中填充數組,如下所示。匿名函數的變量範圍

$(document).ready(function() { 

    function Link(url, title) { 
     this.url = url; 
     this.title = title; 
    } 
    var links = []; 

    $.getJSON("http://reddit.com/r/programming/.json?jsonp=?", function(data) { 
     $.each(data.data.children, function(i, item) { 
      var title = item.data.title; 
      var url = item.data.url; 

      links.push(new Link(url, title)); 
     }) 
    }); 

    for(var i=0; i< links.length; i++) { 
     var output = "<a href='" + k + "'>" + links[k] + "</a>"; 
     $('<p>' + link + '</p>').appendTo('#content'); 
    } 

}); 

但是,當我點擊for循環時,鏈接數組顯示爲空。這裏發生了什麼?

+2

你試圖把一個破發點中的getJSON回調和內部的一個內部之前迭代出現?看哪個先被擊中? –

+1

嘗試移動document.ready外的函數聲明 –

+0

@BigOrangeSU:-1。爲什麼? – Bergi

回答

3

試一下:

$(document).ready(function() { 

     function Link(url, title) { 
      this.url = url; 
      this.title = title; 
     } 

     $.getJSON("http://reddit.com/r/programming/.json?jsonp=?", function(data) { 
      var links = []; 
      $.each(data.data.children, function(i, item) { 
       var title = item.data.title; 
       var url = item.data.url; 

       links.push(new Link(url, title)); 
      }) 
      for(var i=0; i< links.length; i++) { 
       var output = "<a href='" + k + "'>" + links[k] + "</a>"; 
       $('<p>' + link + '</p>').appendTo('#content'); 
      } 
     }); 


    }); 

你的循環您的回調之前可能是執行;)

+0

「可能」 - 通過異步調用,循環將在回調之前執行_definitely_。 – nnnnnn

+0

這是一個異步調用,所以在理論上沒有任何保證。但我同意,在實踐中,它會一直執行。 – tibo

+0

謝謝你。有沒有一種方法來實現這一點,直到所有的json數據被拉出來,執行阻塞?我希望能夠從許多json源代碼中獲取數據並填充數據數組(這只是我的第一個示例),然後在各種填充數組上進行工作。 – hodgesmr

3

這是因爲$.getJSON是異步方法。即使在$.getJSON之後,代碼執行仍會繼續併到達for循環,屆時,異步請求尚未完成。您應該在$.getJSON內移動循環。