出于某种原因,我在JS中回避函数时遇到了麻烦。我认为它最终点击了如何使用它们(sorta),但我仍然无法弄清楚为什么我需要它。这两段代码有何不同,为什么使用回调版本会更好?他们都做同样的事情。它们都消除了重复代码的需要。他们的文件大小相同。对我而言,为什么我在第一个问题上使用回调示例并不明显 - 至少如果目标是防止重复代码(我读到的内容是使用回调的原因)这一点)。
版本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);
答案 0 :(得分:1)
您正在进行正确的回调,但在您使用它们的地方并没有任何意义。
Javascript回调中最大的问题是异步操作 - 例如进行网络调用。这是一些示例代码:
http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first
非常简单 - 您可以开始通话,并在完成通话后给它打电话。无需轮询或执行任何其他同步操作,您只需等待完成后通知,失败等等。
答案 1 :(得分:0)
使用回调函数的场景的主要好处是抽象和模块化。
功能:
addNumsAndWhat();
允许你给它两个数字,添加它们,然后使用回调函数以某种方式操作它们,其中作为函数:
addNumsAndMultiply();
addNumsAndDivide();
他们的工作非常具体。
总而言之,使用回调的方式没有任何实际好处,除非您关心使用该回调的小额外模块化。
答案 2 :(得分:0)
使用回调方法有一个小好处,但在这个使用 - 使用它可能有点过分:
/传递了函数 - 这是一个回调函数 function addNumsAndWhat(num1,num2,callback){ var sum = num1 + num2; 提示("" + num1 +"和" + num2 +"的总和为:" + sum); 回调(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);
你可以这样说:
task = {
multiply: multiply,
divide: divide
};
addNumsAndWhat(4, 5, task['divide']);
因此允许传递字符串参数,可能来自配置对象或业务/游戏规则引擎。
答案 3 :(得分:0)
在您提供的示例中,使用回调并没有真正发挥其实用性。实际上,即使你将函数作为参数传递,也可以回调"它真的没有让它感觉如此。真正的回调函数通常是调用者需要知道某个函数的结果时的函数,这可能是也可能不是异步操作。
代码:
// Asynchronous operation to fetch json
function fetchJSON(cb) {
setTimeout(function() {
// When the work is done, we notify the caller
cb({ name: "maunovaha", age: 29 }, null);
}, 1000);
}
// Asynchronous call
fetchJSON(function(data, error) {
if (error) {
console.log("Error occurred while fetching JSON: " + error);
return;
}
// Do something with the data
console.log(data);
});
简而言之,上面的示例使用了类似node.js数据/错误处理的格式。回调也可以返回错误而不是数据,它将相应地显示。希望这会有所帮助。