在JavaScript事件代码中,使用匿名函数而不是具名函数作为回调函数和参数有哪些好处?
在JavaScript事件代码中,使用匿名函数而不是具名函数作为回调函数和参数有哪些好处?
我对JavaScript还是有些陌生。我了解这门语言的许多概念,我一直在阅读原型继承模型,并且越来越多地涉足交互式前端内容。这是一门有趣的语言,但我总是对许多非平凡交互模型中充斥的回调地狱感到厌烦。
有一件事情一直让我感到奇怪,尽管JavaScript中的回调嵌套会导致代码难以阅读,但在许多示例和教程中,我很少看到使用预定义的命名函数作为回调参数的情况。我白天是一名Java程序员,尽管我不想谈论那些关于代码单元的企业级命名的刻板印象,但在使用功能丰富的集成开发环境时,我发现使用有意义的、尽管有些冗长的名称可以使代码的意图和含义更清晰,而不会增加编写代码的难度。那么为什么在编写JavaScript代码时不采用相同的方法呢?
经过思考,我可以找到支持和反对这个想法的论点,但是由于我对这门语言的天真和新手状态,我无法得出任何关于为什么在技术层面上这样做会有好处的结论。
优点:
- 灵活性。一个带有回调参数的异步函数可以通过许多不同的代码路径访问,为每个可能的边缘情况编写一个命名函数可能会很麻烦。
- 速度。这符合黑客心态。将东西添加到其中,直到它能工作为止。
- 其他人都在这样做。
- 文件大小更小,即使只是微不足道的减小,但在网络上每一点都很重要。
- 更简单的AST?我想匿名函数是在运行时生成的,所以即时编译器不会为了将名称映射到指令而破坏代码。但这只是我的猜测。
- 更快的派发?对此我也不确定。再次猜测。
缺点:
- 它很丑陋和难以阅读。
- 当你深陷回调嵌套的沼泽时,它增加了困惑(公平地说,这可能意味着你编写了构造不良的代码,但这是相当常见的)。
- 对于没有函数式背景的人来说,这可能是一个奇怪的概念。
由于许多现代浏览器显示出比以前更快地执行JavaScript代码的能力,我无法理解使用匿名回调函数可能获得的微不足道的性能提升为什么如此重要。似乎,如果你处于可以使用命名函数的情况下(可预测的行为和执行路径),那就没有理由不这样做。
那么,有没有我不知道的技术原因或陷阱,使得这种做法在实践中如此常见呢?