【发布时间】:2016-04-29 19:24:57
【问题描述】:
出于某种原因,我无法理解 JS 中的回调函数。我认为它终于点击了如何使用它们(排序),但我仍然无法弄清楚为什么我需要。这两段代码有何不同,为什么使用回调版本会更好?他们都做同样的事情。它们都消除了重复代码的需要。它们的文件大小差不多。对我来说,为什么我会在第一个例子中使用回调示例并不明显 - 至少如果目标是防止重复代码(这就是我读到的使用这样的回调的原因)。
版本 1
// no need to pass a function -- not a callback
function addNumsAndMultiply(num1, num2) {
findSum(num1, num2);
var product = num1 * num2;
alert("The product of " + num1 + " and " + num2 + " is: " + product);
}
function addNumsAndDivide(num1, num2) {
findSum(num1, num2);
var quotient = num1 / num2;
alert("The quotient of " + num1 + "/" + num2 + " is: " + quotient);
}
function findSum(num1, num2) {
var sum = num1 + num2;
alert("The sum of " + num1 + " and " + num2 + " is: " + sum);
}
addNumsAndMultiply(3,4);
addNumsAndDivide(30,5);
第 2 版
// passed the function -- this is a callback
function addNumsAndWhat(num1, num2, callback) {
var sum = num1 + num2;
alert("The sum of " + num1 + " and " + num2 + " is: " + sum);
callback(num1,num2);
}
function multiply(num1, num2) {
var product = num1 * num2;
alert("The product of " + num1 + " and " + num2 + " is: " + product);
}
function divide(num1, num2) {
var quotient = num1 / num2;
alert("The quotient of " + num1 + "/" + num2 + " is: " + quotient);
}
addNumsAndWhat(3,4,multiply);
addNumsAndWhat(30,5,divide);
【问题讨论】:
-
回调在这里没用,但如果
addNumsAndWhat异步执行一堆事情(例如,与 Web 服务器对话),它会很有用。当 Web 服务器响应时,addNumsAndWhat可以使用回调告诉它“抱歉,花了这么长时间,但这是您问题的答案。” -
我部分不同意雷蒙德的观点。回调函数不仅在处理异步任务时很有用,它也是实现策略化设计模式的最简单方法。这是一种消除代码重复的方法。
-
@RaymondChen 虽然回调主要用于处理异步,但这并不是它的唯一用途。
-
我并不是说异步是回调的唯一用途;我只是举了一个例子,说明回调如何在执行计算并产生单个结果的上下文中变得有用。但我想我们都同意,在这种情况下,回调没有用。
标签: javascript function parameters callback arguments