如果我有下面的代码,我将两个函数作为参数传递给函数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;
});
答案 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!")
});