Javascript JSFiddle&;回调

Javascript JSFiddle&;回调,javascript,underscore.js,jsfiddle,Javascript,Underscore.js,Jsfiddle,作为练习的一部分,我正在编写下划线函数并在JSFIDLE中测试它们。每次我传递回调函数时,都会得到“未定义” 我的代码如下: each = function(collection, iterator) { if(Array.isArray(collection)){ for (var i = 0; i < collection.length; i++) { iterator(collection[i], i, collection); } } else { for(va

作为练习的一部分,我正在编写下划线函数并在JSFIDLE中测试它们。每次我传递回调函数时,都会得到“未定义”

我的代码如下:

each = function(collection, iterator) {
if(Array.isArray(collection)){
  for (var i = 0; i < collection.length; i++) {
    iterator(collection[i], i, collection);
  }
} else {
  for(var key in collection) {
    iterator(collection[key], key, collection);
  }
}
};

var numbers = [1,2,3,4];

var result = each(numbers, function(num) {
 return num * 2;
});

 console.log(result);
// undefined
each=函数(集合、迭代器){
if(数组.isArray(集合)){
对于(变量i=0;i

知道我做错了什么以及为什么它没有在JSFIDLE上输出吗?

您没有聚合操作的结果,这就是为什么结果不是结果

下面是如何为阵列解决这一问题的快速尝试

each = function(collection, iterator) {
    var arr = [];
    if(Array.isArray(collection)){
    for (var i = 0; i < collection.length; i++) {
        arr.push( iterator(collection[i], i, collection) );
    }
    return arr;
    } else {
    for(var key in collection) {
      iterator(collection[key], key, collection);
    }
    }
};

var numbers = [1,2,3,4];

var result = each(numbers, function(num) {
 return num * 2;
});

 console.log(result);
each=函数(集合、迭代器){
var-arr=[];
if(数组.isArray(集合)){
对于(变量i=0;i

你没有做错什么。您的
每个
函数都没有返回任何内容。这很好,因为每个
函数都不一定要返回任何内容。您可能会考虑使用
map
reduce
函数编译调用集合中每个项的回调的结果,然后返回编译结果

传递给
每个
函数的回调通常不会返回任何内容。想象一个
每个
就像它只是一个正常
for
循环的语法糖
for
循环不返回任何内容(显然是…),它们只对集合中的项和包含范围中声明的变量执行一般操作

也就是说,如果您想要模拟下划线(或任何好的库),您将希望返回集合以启用链接。从:

[each]迭代元素列表,依次生成一个iteratee函数……返回链接列表

这只是一个很好的实践,以避免打扰可能使用您的库并且习惯于能够在JavaScript中链接所有内容的开发人员

所以你需要做的就是

return collection;

在你的
每一个
功能结束时,你都很好。干杯。

each()
本身不会返回任何内容<代码>返回数*2each()
的配合,code>不会自动跳转到
var result
。您的each函数不会返回任何值,只是出于好奇,因为2天前在JSFIDLE上运行代码是有效的。此外,该练习是车底练习的一部分,测试在没有返回声明的情况下在本地通过。有什么想法吗?谢谢@bowhart,非常好的解释!我好像把我的地图和每一张都弄混了。现在一切都清楚了!