高阶函数调用奇怪的行为

时间:2017-11-26 15:44:29

标签: javascript function functional-programming higher-order-functions nested-function

我一直在玩上面的代码,但仍然不知道为什么它会像这样:

function myforEach(arr, func){
  for(var i=0; i<arr.length; i++){
    func();
  }
}
var arr = [1,2,3];

function func2(){
 return 3+3;
}

myforEach(arr, func2); // undefined

我创建了一个myforEach函数,它接受一个数组的两个参数和一个作为参数func传递的函数,在for循环中调用3次。然后我声明另一个函数func2,它返回加3 + 3的值。 然后我使用两个参数运行myforEach,我希望在控制台中打印3次值6,但是返回的内容是未定义的。

当我将func2语句更改为:

function func2(){
 console.log(3+3);
}

再次运行我将控制台记录6次三次。 myforEach(arr, func2); // (3)6

然后我再次将func2语句更改为:

function func2(){
 console.log("hi");
}

myforEach(arr, func2); // (3)hi

如果尝试myforEach(arr, alert); // (3)alert但是如果我尝试在没有括号function func2(){alert;} // undefined的情况下在func2中发出警报,但是在添加括号function func2(){alert();}时会发出三次警报

所以问题是为什么function func2(){return 3+3;}没有返回6次?因为在for循环中func()在括号中意味着调用添加的任何函数,为什么不正确调用func2?

我对stackoverflow进行了一些研究,但我得到的只是由于某种原因导致丢失,但没有进一步详细解释为什么和根本原因。

在这里已经很晚了,我不知道我是在遗失某些东西还是太困了。任何解释都会有所帮助。谢谢:))

1 个答案:

答案 0 :(得分:2)

  

所以问题是为什么函数func2(){return 3 + 3;}三次没有返回6?

它是 - 你只是没有做任何返回值。您已将func2传递给myforEach并将其作为func接收,但随后:

function myforEach(arr, func){
  for(var i=0; i<arr.length; i++){
    func(); // <=== You're not using the return value for anything
  }
}

只返回该值不会导致它在任何地方自动输出。

请注意,内置forEach也是如此:

console.log("Nothing gets output after this message");
var arr = [1,2,3];
function func2(){
 return 3+3;
}
arr.forEach(func2);

forEach故意是乏味的,它使用您提供的函数的返回值 nothing 。它不记得任何地方(那将是map),输出它,与其他人(有效地reduce总结),等等。你的myforEach同样是乏味的