作为参数传递的函数是否总是回调? JavaScript

Are functions passed as parameters always callbacks? JavaScript

如果我有下面的代码,其中我将两个函数作为参数传递给函数 sayHi,这是回调的示例吗?

我注意到 运行 这些 'parameter functions' 有两种方式:如下所示,我们在定义它们的地方调用函数(作为参数),或者在我调用参数的地方sayHi 函数。这就是回调函数和匿名函数的区别吗?

function sayHi(name, testForTrue) {
    if (testForTrue == true) {
        console.log(name);
    }
}

sayHi(function() {
    return 'Zach'
}(), function() {
    return true;
}());

我可以获得相同结果的另一种方法如下所示。在这种情况下,我是在不同的时间评估功能吗?两者之间有什么实际区别吗?

function sayHi(name, testForTrue) {
    if (testForTrue() == true) {
        console.log(name());
    }
}

sayHi(function() {
    return 'Zach'
}, function() {
    return true;
});

在您的第一个示例中,您传递的不是函数,而是值;也就是说

(function(){ return 3; })()

就是整数3。

是立即调用函数得到的值,与此无关

当您传递回调时,接收者将调用它(或将其传递给其他函数)并且代码将稍后执行,而不是在调用点。

我想这取决于您的 回调 函数实际在做什么。

在您的示例中,您实际上所做的只是返回一个值。这不是真正的 "function",它每次都返回一个固定值。

如果你的函数实际上是在做一个过程,或者返回一个不同的结果,那么我个人认为它是一个回调。 (它的名字是不言自明的,真的)。您的脚本不应依赖它,而应将其作为函数结果的处理程序。

例如,像这样的东西就是我认为的回调函数:

function doSomething(callback) {
  var userInput = prompt("hello, enter a number 1-10"),
      hasWon = false;

  if (userInput === "3") hasWon = true;

  callback(hasWon);
};

有了这个提供,我们可以这样称呼它:

doSomething(function(hasWon){
  if (hasWon) alert("Congratz! You guessed my lucky number!")
});

是的,作为参数传递的函数始终是回调,即使意图是函数被调用 同步 (c.f. Array.prototype.map) 而不是比 异步 (c.f. window.setTimeout).

在您的第一个代码块中,您当然没有真正传递函数。您有两个 immediately invoked 函数表达式,其中此上下文中的关键部分是 immediately invoked。函数表达式在它们出现在代码中的位置被调用,并且只有这些表达式的 结果 被传递给 sayHi.