【问题标题】:javascript function returning undefined [duplicate]javascript函数返回未定义[重复]
【发布时间】:2013-06-26 15:45:16
【问题描述】:

我确定我做错了,但我有以下函数在控制台中返回“未定义”,即使它可以 console.log() 来自函数中相同位置的所需值,如注释代码。

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"]。但是,当我尝试使用 tags 变量(即:元素的文本值等)时,它不起作用...... 是什么赋予了? JavaScript 不是我的第一语言,所以我对它的行为方式有点困惑。我只是不明白。

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

注意:

  1. JSON 来自 Joomla(3.1) 标签表。
  2. 我能够检索数据。
  3. val === tagId 条件工作正常。
  4. 我喜欢爆米花。

【问题讨论】:

  • getTagNames 没有 return 声明。您的问题中唯一带有return 语句的函数是您传递给getJSON 的匿名函数。

标签: javascript function return undefined


【解决方案1】:

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
});

【讨论】:

  • 我认为它是我需要调用 getTagNames 函数时没有得到的“回调”函数。和参数一样,tagArray 在这里代表什么。我想用它做什么。我想我在返回值时也习惯了 php。
  • tagArray 是从您的原始代码中复制的(与大多数代码一样)。所以通过调用 getTagNames 来填充 tagArray。您传递的第二个参数是一个函数,它在对 getTagNames 的调用“完成”时处理“返回值”。
【解决方案2】:

语句return tagArray;返回getJSONsuccess处理程序的结果,首先,不期望任何返回值,其次,异步发生-在您的getTagNames完成执行之后。

【讨论】:

  • 这几乎是我从我查看的其他问题中得到的答案,我只了解它的工作原理。但是,我似乎无法找到任何参考资料,可以让我目前对整个概念的理解变得愚蠢。仍在阅读一些材料,这样我就可以击中那个“啊哈”的时刻。非常感谢任何人可以指导我的任何地方(最好是基于教程的)。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2015-12-26
相关资源
最近更新 更多