我对 JavaScript 还很陌生。我了解该语言的许多概念,我一直在阅读原型继承模型,并且我正在通过越来越多的交互式前端内容来磨练我的口哨。这是一种有趣的语言,但我总是对回调意大利面条有点反感,这是许多重要交互模型的典型特征。
我一直觉得奇怪的是,尽管 JavaScript 嵌套回调是可读性的噩梦,但我在许多示例和教程中很少看到的一件事是使用预定义的命名函数作为回调参数。我白天是一名 Java 程序员,抛弃关于代码单元的 Enterprise-y 名称的刻板印象 http://projects.haykranen.nl/java/我开始享受使用具有多种功能 IDE 的语言进行工作的原因之一是,使用有意义的(即使很长的)名称可以使代码的意图和含义更加清晰,而不会使实际工作变得更加困难。那么为什么在编写 JavaScript 代码时不使用相同的方法呢?
经过思考,我可以提出支持和反对这个想法的论据,但我对语言的天真和新鲜感妨碍了我得出任何关于为什么这在技术层面上是好的结论。
Pros:
- 灵活性。具有回调参数的异步函数可以通过许多不同的代码路径之一来访问,并且必须编写一个命名函数来考虑每种可能的边缘情况,这可能会很麻烦。
- 速度。它在很大程度上影响了黑客的心态。用螺栓将东西固定在上面,直到它起作用为止。
- 其他人都在做
- 文件大小较小,即使是微不足道的,但在网络上每一点都很重要。
- 更简单的 AST?我假设匿名函数是在运行时生成的,因此 JIT 不会将名称映射到指令,但我现在只是猜测。
- 发货更快?对此也不确定。又来猜了
Cons:
- 这是丑陋且难以理解的
- 当您深陷回调沼泽中时,它会增加混乱(公平地说,这可能意味着您一开始就编写了糟糕的代码,但这很常见)。
- 对于没有职能背景的人来说,grok 可能是一个奇怪的概念
由于许多现代浏览器显示出比以前更快地执行 JavaScript 代码的能力,我不明白使用匿名回调可能获得的任何微不足道的性能提升是如何必要的。看来,如果您处于使用命名函数是可行的情况(可预测的行为和执行路径),那么就没有理由不这样做。
那么,是否有任何我不知道的技术原因或陷阱使得这种做法如此普遍?
我使用匿名函数有三个原因:
- 如果不需要名称,因为该函数只在一个地方被调用,那么为什么要向您所在的任何名称空间添加名称。
- 匿名函数被声明为内联函数,内联函数的优点在于它们可以访问父作用域中的变量。是的,您可以为匿名函数命名,但如果将其声明为内联,则通常毫无意义。所以内联有一个显着的优势,如果你正在做内联,就没有理由给它命名。
- 当处理程序直接在调用它们的代码内部定义时,代码看起来更加独立和可读。您可以以几乎顺序的方式阅读代码,而不必去查找具有该名称的函数。
我确实尝试避免匿名函数的深层嵌套,因为这可能很难理解和阅读。通常,当发生这种情况时,有更好的方法来构造代码(有时使用循环,有时使用数据表等......),并且命名函数通常也不是解决方案。
我想我要补充一点,如果回调开始超过大约 15-20 行长,并且不需要直接访问父作用域中的变量,我会很想给它一个名称并将其分解为它是在其他地方声明的自己的命名函数。这里肯定有一个可读性点,即一个很长的不平凡的函数如果放在自己的命名单元中就更容易维护。但是,我最终得到的大多数回调都没有那么长,而且我发现将它们保持内联更具可读性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)