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

时间:2015-06-13 08:16:23

标签: javascript callback anonymous-function

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

我注意到有两种运行这些'参数函数'的方法:如下所示,我们调用它们被定义的函数(作为参数),或者我在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;
});

3 个答案:

答案 0 :(得分:3)

是的,作为参数传递的函数总是回调,即使意图是函数同步调用(cf Array.prototype.map)而不是异步( cf window.setTimeout)。

在你的第一个代码块中,你当然不是实际传递函数。您有两个立即调用的函数表达式,其中此上下文中的关键部分是立即调用。函数表达式在它们出现在代码中时被调用,只有这些表达式的结果被传递给sayHi

答案 1 :(得分:2)

在你的第一个例子中,你没有传递函数,而是传递值;换句话说

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

只是整数3。

这是一个立即调用函数的值,但这是无关紧要的。

当您传递回调时,接收方将调用它(或将其传递给其他某个函数),代码将在稍后执行,而不是在呼叫站点执行。

答案 2 :(得分:1)

我想这取决于你的回调功能实际上在做什么。

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

如果你的功能实际上正在进行一个过程,或者返回一个不同的结果,那么我个人认为它是一个回调。 (它的名字是不言自明的,真的)。你的脚本不应该依赖它,而是让它成为函数结果的处理程序。

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

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!")
});