JavaScript高阶函数循环/递归/混淆

时间:2014-10-28 00:32:25

标签: javascript for-loop functional-programming

  

实现一个函数,该函数将函数作为其第一个参数,数字num作为其第二个参数,然后执行传入的函数num次。

function repeat(operation, num) {
  var num_array = new Array(num);
  for(var i = 0; i < num_array.length; i++){
    return operation(num);
  }
}
// 
// The next lines are from a CLI, I did not make it.
// 
// Do not remove the line below
module.exports = repeat 

结果

ACTUAL                             EXPECTED
------                             --------
"Called function 1 times."         "Called function 1 times."     
""                              != "Called function 2 times."     
null                            != ""                             
# FAIL

为什么这不起作用?

我假设我正在启动一个名为repeat的函数。重复有两个参数,并带两个参数。

对于循环,我创建一个数组,其长度等于传入的数字。

然后我启动一个for循环,将一个计数器变量i设置为0.然后我设置一个条件,表明我应该总是小于之前创建的num_array的长度。然后使用++将计数器i递增1。

每当条件为真时,我们应该返回调用运行函数操作的值并将num作为参数传递。

最后两行允许通过命令行轻松运行程序,并使用预先编程的参数。

感谢您的时间!

3 个答案:

答案 0 :(得分:2)

return语句在循环的第一次迭代中突破了该函数。您需要删除return,然后调用此函数:

function repeat(operation, num) {
  for(var i = 0; i < num; i++){
    operation(num);
  }
}

请注意,我已经删除了数组的创建和迭代,您不需要它来执行此处的操作。

此外,您的初始问题并未指明您需要将num传递给该功能(但您会在下面的步骤中将其列出),因此您可以只执行operation()而不是operation(num)

答案 1 :(得分:0)

您可能需要类似下面的内容,而不是return要将值存储在数组中的函数operation(num)的结果。循环中的return突然出现循环,所以它总是只运行一次..

function repeat(operation, num) {
  var num_array = new Array(num);
  for(var i = 0; i < num_array.length; i++){
    num_array[i] = operation(num);
  }
}
// 
// The next lines are from a CLI, I did not make it.
// 
// Do not remove the line below
module.exports = repeat 

答案 2 :(得分:0)

如果你问为什么循环没有运行,那是因为你必须在定义它之后运行该函数(我假设你还没有在其他地方调用函数)。

调用函数repeat后,您将看到它在一次迭代后退出。这是因为您正在返回操作 - 返回导致函数结束。要保持循环,您只需拨打operation(),而不需要return

此外,您不需要创建数组,只需使用您在for循环中定义的计数器。

所以代码看起来像这样:

var op = function(arg) {console.log(arg);},
    n = 5;

function repeat(operation, num) {
  for(var i = 0; i < num; i++){
    operation(i);
  }
}

repeat(op ,n);

// The next lines are from a CLI, I did not make it.
// 
// Do not remove the line below
module.exports = repeat