2013-06-28 273 views
4

我确信我正在做这种各种各样的错误,但我有以下函数返回'undefined'在控制台,即使它可以console.log()所需的值来自同一地方在函数在代码中评论。javascript函数返回undefined

var tags = [4, 5]; 
console.log(getTagNames(tags)); // 'undefined' 

function getTagNames(tagArray) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     return tagArray; 
    }); 
} 

另一个奇怪的是,在浏览器中运行此代码后,我可以键入“标签”到浏览器控制台,它给了我正确的结果["foo", "bar"]。然而,当我尝试使用标签变量(即:文本值的元素等),它不起作用... 什么给? JavaScript不是我的第一语言,所以我对它的行为有些困惑。我只是不明白。

我已经阅读了几乎所有的“可能已经有我的答案的问题”,但是提供了那些我无法弄清楚如何应用于我的功能的答案。

注:

  1. 的JSON距离的Joomla(3.1)标签表。
  2. 我能够检索数据。
  3. val === tagId条件工作正常。
  4. 我喜欢爆米花。 success处理器的getJSON其中,第一,不期待任何回报价值,二是异步发生的
+1

'getTagNames' **没有** return语句。在你的问题中,带有'return'语句的唯一函数是你传递给'getJSON'的匿名函数。 – Quentin

回答

9

致电getJSON异步调用您的回调函数。

如果您需要的功能getTagNames,并调用它在你的代码中的许多地方,你可以进行更改,使之采取一个回调函数本身:

function getTagNames(tagArray, cb) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     cb(tagArray); 
    }); 
} 

,然后拨打电话,以这样的:

getTagNames(tags, function(tagArray) { 
    // do something with tagArray 
}); 
+0

我认为它的“回调”功能,当我需要调用getTagNames函数时,我没有得到它。就像参数tagarray在这里表示的那样。我想用它做什么?我想我也只是在返回值时使用php。 – jremydeaton

+1

tagArray被复制(像大多数代码)从您的原始。因此,通过调用getTagNames来填充tagArray。您传递的第二个参数是一个处理getTagNames调用“完成”时的“返回值”的函数。 – mbanzon

2

声明return tagArray;返回结果 - 的方式之后,你getTagNames执行完毕。

+1

这几乎是我从其他问题中得到的答案,我只查看了一下它的工作原理。不过,我似乎无法找到任何参考资料,因为我目前对整个概念的理解都是愚蠢的。仍然阅读一些材料,所以我可以打到“啊哈”时刻。任何地方任何人都可以指导我(最好是基于教程)非常感谢。 – jremydeaton