2014-02-07 232 views
2

首先,我是JavaScript新手,這是我的第一個使用該語言的「項目」,所以我提前爲自己的空想道歉。Javascript函數返回undefined

我在這個項目中使用傳單和D3,我似乎無法得到此函數返回除'未定義'之外的任何東西。起初我,雖然我不是從函數返回正確的,所以我試圖複製在較小的規模在這裏的錯誤:

http://jsfiddle.net/KhqwR/

然而,這對我的工作所以現在我什麼有點失落去做。

這裏是我的代碼一個簡單的版本,我試圖刪除似乎並不相關的一切,改變了名稱,以使其更易於理解:

$(function() { 
    ... 
    function getThings(code) {  
    d3.csv("data.csv", function(data){ 
     for (var i = 0, len = data.length; i < len; i++){   
     if (data[i].code == code){      
      alert("return 5!") 
      return 5; 
     } 
     else{ 
      return 0; 
     } 
     } 
    }) 
    } 

    L.geoJson(features, { 
    style: function (feature) { 
     return { opacity: 0, fillOpacity: 0.5, fillColor: "#0f0" }; 
    }, 
    onEachFeature: function(feature, layer){ 
     var test = getThings(5);  
     alert(test); 
     ... 

我始終得到「迴歸5 !」警報,然後在警報(測試)我只是得到「未定義」。

有人知道我出錯了嗎? 在此先感謝!

回答

2

d3.csv其實returns a useful value可用於附加相關回調。但是,因爲 不是有一個返回語句,所以調用時它總是會產生未定義的。

請記住,return適用於最近的封閉功能,包括匿名功能,如提供的回調。

function getThings(code) { 
    /* Without an explicit return, a function always evaluates 
     to undefined when invoked. */ 
    return d3.csv("data.csv", function(data){ .. }); 
}) 

var test = getThings(..); 
/* Now test is NOT undefined, but is also NOT the data 
    for the asynchronous reasons discussed elsewhere. 
    See the link above for correct usage. */ 
test.row(..); 
1

d3.csv()是異步的。這意味着,該函數getThings()踢關閉d3.csv()瞬間返回undefined

d3 documentation

問題的爲逗號分隔值(CSV)文件 在指定的URL的HTTP GET請求。文件內容假定爲符合RFC4180的 。請求的MIME類型將是「text/csv」。 該請求異步處理,,使得此方法在打開請求後立即返回 。

+0

雖然如此,如果OP在getThings功能使用'return','test'將被分配的非未定義的值(但不是數據)。 – user2864740

+1

對。如果他正在做'return d3.csv()',我們會被退回,很可能是一個承諾。 – xbonez

0

這是由於Javascript異步自然。使用函數回調。