JSFiddle 和回调

JSFiddle & Callbacks

作为练习的一部分,我正在重写下划线函数并在 jsfiddle 中测试它们。每次传递回调函数时,我都会得到 "undefined".

我的代码如下:

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

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

您没有汇总操作结果,这就是结果不是结果的原因。

这里简要介绍了如何为数组修复此问题。

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

jsfiddle

你没有做错任何事。您的 each 函数没有 returning 任何东西。这很好,因为 each 函数不一定要 return 任何东西。您可能会按照 mapreduce 函数的思路进行思考,该函数编译对集合中的每个项目调用回调的结果,然后 return 该编译。

您传递给 each 函数的回调通常不会 return 任何东西。把 each 想象成普通 for 循环的语法糖; for 循环不会 return 任何东西(显然..),它们只是对集合中的项目和已在包含范围中声明的变量执行通用操作。

也就是说,如果您想模拟下划线(或任何好的库),您需要 return 集合以启用链接。来自 underscore docs:

[each] Iterates over a list of elements, yielding each in turn to an iteratee function....Returns the list for chaining.

这只是一个很好的做法,以避免惹恼可能使用您的库并且习惯于能够链接 JavaScript 中的所有内容的开发人员。

所以你需要做的就是把

return collection;

each 函数的末尾,你很好。干杯。