作为NodeJS中的参数

时间:2017-11-03 04:48:33

标签: javascript node.js

在NodeJS中,我将第一个函数作为第二个函数的参数传递,如下所示:

第一个功能

function sayHello(){
  console.log('Hello World!');
}

第二个功能

function log(func){
  func();
}

将第一个函数作为第二个函数的参数传递(1):

log(sayHello)();

当我运行上面的代码(1)时,有一个 TypeError ,正确的方法是:

log(sayHello); //Without a pair of brackets at the end of the line

为什么我不能使用log(sayHello)()来调用普通函数?

3 个答案:

答案 0 :(得分:1)

几点:

  • 这是非常基本的JS,与节点
  • 无关
  • 你如何调用函数func(a)?您键入func(myArg),而不是func(myArg)()!
  • 如果我理解你的问题,你会问为什么要

    FUNC(a)中

而不是

func(a)()

非常简单:因为func(a)()执行其他操作:它与(func(a))()相同:

  • 首先计算func(a)
  • 然后获取函数func(a)的结果(return)
  • 将返回的对象作为函数执行

如果您的函数没有return语句,则返回undefined。所以你实际上在做:

undefined()

undefined不是来自可以执行的类型。所以你得到了一个typeError。

我们举几个例子:

function sayHello(){
  console.log('Hello World!');
}

function thatReturnSomeThing(){
  return 123
}

function log(myFunc){
  myFunc()
}

function logWithReturn(myFunc){
  return myFunc()
}
 
function justReturn(myFunc){
  return myFunc
}

function functionThatReturnAFunction(){
  return function() {return "lots of returns here"}
}

let a = log(sayHello)
console.log("a = " + a) // undef

let b = logWithReturn(sayHello)
console.log("b = " + b) //undef because console.log does not return anything

let c = log(thatReturnSomeThing)
console.log("c = " +c) // undef cause log does not return anything

let d =logWithReturn(thatReturnSomeThing)
console.log("d = " + d) //123 because we returned the result of thatReturnSomeThing, which as well returned something different than undef

let e = logWithReturn(functionThatReturnAFunction)
console.log("e = " + e) //we returned a function, so we log the function itself
let f = logWithReturn(functionThatReturnAFunction)() //the behaviour you actually wanted is that I think
console.log("f = " +f)

我让你运行那段代码,我希望它能帮助你理解函数和返回对象(可以是一个函数)之间的区别。

答案 1 :(得分:0)

function sayHello(){
  return console.log('Hello World!');
}
function log(func){ 
  return func;
};
log(sayHello)();

就这样做。你说你好没有回来。

答案 2 :(得分:0)

log()的返回类型不是您获得类型错误的函数。当您致电log(sayHello)时,它正在拨打sayHello(),然后拨打console.log()。然后console.log()返回给定的输入,而不是函数。

如果您想呼叫log(sayHello)(),只需按照以下说明更改日志功能:

function log(func){
  return func;
}