在这里使用回调函数(JavaScript)有什么好处吗?

时间:2016-04-29 19:24:57

标签: javascript function parameters callback arguments

出于某种原因,我在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);

4 个答案:

答案 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)

在您提供的示例中,使用回调并没有真正发挥其实用性。实际上,即使你将函数作为参数传递,也可以回调"它真的没有让它感觉如此。真正的回调函数通常是调用者需要知道某个函数的结果时的函数,这可能是也可能不是异步操作。

Js Fiddle example

代码:

// 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数据/错误处理的格式。回调也可以返回错误而不是数据,它将相应地显示。希望这会有所帮助。

相关问题