Javascript函数返回undefined

3

首先我是Javascript的新手,这是我用这种语言的第一个“项目”,所以我提前为我的新手状态道歉。

在这个项目中,我使用了leaflet和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!”的提示,但在alert(test)处我只得到了“未定义”的结果。有人知道我哪里出错了吗?提前致谢!
3个回答

2

d3.csv实际上返回一个有用的值,可用于附加相关回调。但是,由于getThings没有return语句,因此在调用时始终会产生undefined。

请记住,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文档:

发出HTTP GET请求以获取指定URL处的逗号分隔值(CSV)文件。假定文件内容符合RFC4180标准。请求的MIME类型将为"text/csv"。请求是异步处理的,因此此方法在打开请求后立即返回。


当条件为真时,如果 OP 在 getThings 函数中使用 return,则 test 将被分配一个非 undefined 值(但不是数据)。 - user2864740
1
没错。如果他执行的是 return d3.csv(),我们很可能会得到一个 Promise。 - Ayush

0

这是由于JavaScript异步特性导致的。请使用回调函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接