【问题标题】:What practical application is there to run a function as a parameter as opposed to before/after the initial function call?与初始函数调用之前/之后相比,将函数作为参数运行有什么实际应用?
【发布时间】:2017-09-09 05:23:56
【问题描述】:

我理解在 javascript 中将函数作为变量传递的概念——无论是函数变量还是匿名函数。但是,我不明白何时或为什么应该将函数作为参数而不是在主函数调用之前或之后执行。

例如:

假设创建了一个回调函数和一个私有函数-

function callback(y) {
       alert(y);
    }

function foo(x, callback) {
       alert(x);
    }

这两种说法有什么区别?后一种说法什么时候比第一种更实用?

foo(bar);
callback(bas);

foo(bar, callback(bas));

我确定这在语法上不正确,但希望它能够说明我想要传达的内容。

最终,我试图了解何时将函数作为参数运行是可行的。

【问题讨论】:

  • 回调通常是异步调用的。在调用启动异步操作的函数之后,同步调用它们会破坏等待异步操作成功或失败的目的。
  • “回调”在这里有点用词不当,所以我可能不应该使用它。我只是碰巧在使用回调时意识到了这种情况。正如我所说,我最终试图理解何时以及为什么应该将函数作为参数执行,而不是独立的函数调用——不管它是否是回调。

标签: javascript function parameters callback


【解决方案1】:

当语言允许像任何其他对象一样传递函数时,它们被称为第一类函数。它们赋予了在称为函数式编程的新编程范式中进行编码的能力。

如果代码是同步的,那么foo(bar)和callback(bas)的执行顺序就没有区别

但是如果 foo 函数是异步的,而回调不是,那么如果你执行

foo(bar)
callback(bas)

callback 将首先执行,然后 foo 执行。如果您作为参数传递,回调执行可以延迟到执行 foo 之后。

如果 foo() 函数作为参数传递,即使在 foo() 完成执行之后,回调也可以访问该函数的变量。

【讨论】:

  • "即使在 foo() 完成执行之后,如果由于闭包而作为参数传递,回调也将能够访问 foo() 函数的变量。" - 对我来说,这似乎是一个非常有效的理由来执行一个函数作为参数,这正是我想要得到的。感谢您看穿“回调”并认识到参数执行功能的混乱。
  • 太棒了:)
【解决方案2】:

正如发布的那样,foo 函数不使用其callback 参数,因此callbackfoo 之间没有有效区别。

缺少的是回调通常是异步调用的。在调用者代码中同步调用它们,在调用启动异步操作的函数之后,会破坏等待异步操作成功或失败后再启动回调操作的目的。

如果由提供回调(函数值)的操作函数执行的操作以某种方式设法同步执行操作,则可能会发生犹豫不决。回调应该在操作函数返回之前同步进行,还是在操作函数返回其调用者之后在事件循环调用中异步进行? ECMAScript Promise 模型是后者 - 在一段时间后异步进行回调。

【讨论】:

  • 这是否真的解释了何时以及为什么将/应该将函数作为参数而不是独立函数执行?这似乎只会增加更多的混乱。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多