【发布时间】:2012-05-03 15:07:31
【问题描述】:
我是 JavaScript 新手。我了解该语言的许多概念,我一直在阅读原型继承模型,并且我正在用越来越多的交互式前端内容来激起我的兴趣。这是一门有趣的语言,但我总是被许多非平凡交互模型中典型的回调意大利面条所吸引。
我一直觉得奇怪的是,尽管 JavaScript 嵌套回调嵌套的可读性噩梦,但我在许多示例和教程中很少看到的一件事是使用预定义的命名函数作为回调论据。我白天是一名 Java 程序员,discarding the stereotypical jabs about Enterprise-y names for units of code 使用一种具有强大功能的 IDE 选择的语言,我最喜欢的一件事是使用有意义的(如果长的话)名称可以表达意图和意义代码更清晰,而不会使实际生产变得更加困难。那么为什么在编写 JavaScript 代码时不使用相同的方法呢?
考虑一下,我可以提出支持和反对这个想法的论据,但我对这门语言的天真和新奇使我无法得出关于为什么这在技术层面上会很好的任何结论。
优点:
- 灵活性。带有回调参数的异步函数可以通过许多不同的代码路径之一访问,并且可能不得不编写一个命名函数来解决每个可能的边缘情况。
- 速度。它在很大程度上影响了黑客的心态。用螺栓固定它,直到它起作用。
- 其他人都在这样做
- 较小的文件大小,即使是微不足道的,但在网络上的每一位都很重要。
- 更简单的 AST?我会假设匿名函数是在运行时生成的,因此 JIT 不会将名称映射到指令,但我只是在猜测这一点。
- 更快的调度?这个也不确定。再次猜测。
缺点:
- 丑陋且难以阅读
- 当您将坚果嵌套在大量回调中时,这会增加混乱(公平地说,这可能意味着您一开始就编写了结构不佳的代码,但这很常见)。
- 对于没有功能背景的人来说,理解它可能是一个奇怪的概念
有这么多现代浏览器显示出比以前更快地执行 JavaScript 代码的能力,我看不出使用匿名回调如何获得任何微不足道的性能提升是必要的。看来,如果您处于使用命名函数可行的情况(可预测的行为和执行路径),那么没有理由不这样做。
那么,是否有任何我不知道的技术原因或陷阱导致这种做法如此普遍?
【问题讨论】:
-
我不同意你的大多数“专业人士”,听起来你只是在猜测。也不喜欢你的缺点。底线是,对于短函数,它更有意义。就像在 Java 中一样,我们不会创建一个简短的、包含目的的命名类,我们使用匿名内部类。当复杂性需要传递可重用和/或非平凡的函数时,JS 使用任何模块模式(如果有的话)。这是到处使用的;没有看到它并不意味着在有意义的时候没有使用它。
-
@DaveNewton 我知道它就在那里,我只是想问为什么它似乎不是标准,以及为什么会出现这种情况是否存在任何客观的技术限制。至于 Java 中的匿名内部类,我只倾向于在不需要对接口进行具体实现时使用它们,比如如果我需要生成一个非常简单的 Runnable。当我这样做时,我不喜欢它。
-
在 IE(至少某些版本)中,使用 命名函数表达式 会导致两个不同的函数实例(注意
var a = function(){...}不是不是命名函数(表达式)。分配给a的函数仍然是匿名的)。这就是为什么最好避免它们。当然,你总是可以使用函数声明来代替,但是如果只使用一次,似乎没有必要在作用域中创建符号。 -
@FelixKling 这似乎是一个很好的、客观的、技术性的理由来避免它们。但是函数语句/声明呢?
-
“把东西固定在它上面,直到它工作”不是黑客的心态,那是一种“我不明白我的代码是如何工作的,这对我来说都是魔法”的心态。
标签: javascript coding-style callback anonymous-function code-readability