如何在没有返回值的情况下进行回调在高阶函数中工作

时间:2018-04-25 19:09:53

标签: javascript callback higher-order-functions

我发布的代码有效,但它没有按照我的提示说明

  

“创建一个带有数组和回调的函数forEach,并对数组的每个元素运行回调.forEach不返回任何内容。请不要使用原生的forEach或map方法。”

- 它表示它不会在forEach中返回任何内容。我只能让它回来工作。有人可以帮我理解如何在保持功能的同时不使用forEach函数返回吗?

// Challenge 1
function subtractTwo(num) {
    return num - 2;  
}

function map(array, callback) {
    var newArray = [];
  for (var i = 0; i < array.length; i++) {
    newArray.push(callback(array[i]));
  }
  return newArray;
}

console.log(map([3, 4, 5], subtractTwo));


// Challenge 2
function forEach(array, callback) {
    var newArray = []
  for (var i = 0; i < array.length; i++) {
    newArray.push(callback(array[i]));
  }
  return newArray
}

// Challenge 3
function mapWith(array, callback) {
    var newArray = [];
  return forEach(array, callback);
}
console.log(mapWith([3, 4, 5], subtractTwo));

这是第三个挑战提示

  

现在让我们从challenge 1重建地图作为mapWith。这次不是使用for循环,而是使用在challenge 2中创建的forEach函数。

2 个答案:

答案 0 :(得分:1)

提示语言非常重要:

  

创建一个带有数组和回调的函数forEach,在数组的每个元素上运行回调。 forEach不返回任何内容

它要求你在数组的每个元素上调用一个函数,但它不是要求你返回一个数组。与map不同,forEach仅在每个项目上调用提供的回调,但它不会返回数组。

From MDN:“forEach()方法为每个数组元素执行一次提供的函数。”例如,请使用native forEach考虑此代码:

var foo = [1, 2, 3];

function logger(item) {
  console.log(item);
}

foo.forEach(logger);

>1
>2
>3

此外,如果我们尝试记录从forEach返回的内容,我们会得到以下内容:

console.log(foo.forEach(logger));
>1
>2
>3
>undefined // The returned value

您的实施已接近,但您可能已尝试在map功能中添加forEach功能(返回新阵列)。您需要修改它,以便它只调用每个项目的函数,但不创建或返回新数组。

为了创建mapWith函数,您可能需要一个处理创建新数组的中间函数,但该函数将与callbackforEach分开。

答案 1 :(得分:1)

根据这个提示,你几乎就在那里,但是你做得太多了。你只需要按照提示说的那样做,为每个元素运行回调,而不是其他任何东西。不要尝试使用回调的结果,也不要创建新的数组。

所以第二个挑战实施可能如下:

-XX:HeapDumpPath=/dev/null

使用// Challenge 2 function forEach(array, callback) { // Just run the callback for each element. Do not save the results // anywhere, do not return anything. for (var i = 0; i < array.length; i++) { callback(array[i]); } } ,您必须稍微更改forEach功能才能使用它。在mapWith中,不是将回调直接传递给mapWith,而是将其包装在另一个函数中,您可以从原始回调中捕获结果并将其推送到新数组中。

类似于:

forEach