在 JavaScript 事件代码中使用匿名函数而不是命名函数进行回调和参数有什么好处?

2024-01-14

我对 JavaScript 还很陌生。我了解该语言的许多概念,我一直在阅读原型继承模型,并且我正在通过越来越多的交互式前端内容来磨练我的口哨。这是一种有趣的语言,但我总是对回调意大利面条有点反感,这是许多重要交互模型的典型特征。

我一直觉得奇怪的是,尽管 JavaScript 嵌套回调是可读性的噩梦,但我在许多示例和教程中很少看到的一件事是使用预定义的命名函数作为回调参数。我白天是一名 Java 程序员,抛弃关于代码单元的 Enterprise-y 名称的刻板印象 http://projects.haykranen.nl/java/我开始享受使用具有多种功能 IDE 的语言进行工作的原因之一是,使用有意义的(即使很长的)名称可以使代码的意图和含义更加清晰,而不会使实际工作变得更加困难。那么为什么在编写 JavaScript 代码时不使用相同的方法呢?

经过思考,我可以提出支持和反对这个想法的论据,但我对语言的天真和新鲜感妨碍了我得出任何关于为什么这在技术层面上是好的结论。

Pros:

  • 灵活性。具有回调参数的异步函数可以通过许多不同的代码路径之一来访问,并且必须编写一个命名函数来考虑每种可能的边缘情况,这可能会很麻烦。
  • 速度。它在很大程度上影响了黑客的心态。用螺栓将东西固定在上面,直到它起作用为止。
  • 其他人都在做
  • 文件大小较小,即使是微不足道的,但在网络上每一点都很重要。
  • 更简单的 AST?我假设匿名函数是在运行时生成的,因此 JIT 不会将名称映射到指令,但我现在只是猜测。
  • 发货更快?对此也不确定。又来猜了

Cons:

  • 这是丑陋且难以理解的
  • 当您深陷回调沼泽中时,它会增加混乱(公平地说,这可能意味着您一开始就编写了糟糕的代码,但这很常见)。
  • 对于没有职能背景的人来说,grok 可能是一个奇怪的概念

由于许多现代浏览器显示出比以前更快地执行 JavaScript 代码的能力,我不明白使用匿名回调可能获得的任何微不足道的性能提升是如何必要的。看来,如果您处于使用命名函数是可行的情况(可预测的行为和执行路径),那么就没有理由不这样做。

那么,是否有任何我不知道的技术原因或陷阱使得这种做法如此普遍?


我使用匿名函数有三个原因:

  1. 如果不需要名称,因为该函数只在一个地方被调用,那么为什么要向您所在的任何名称空间添加名称。
  2. 匿名函数被声明为内联函数,内联函数的优点在于它们可以访问父作用域中的变量。是的,您可以为匿名函数命名,但如果将其声明为内联,则通常毫无意义。所以内联有一个显着的优势,如果你正在做内联,就没有理由给它命名。
  3. 当处理程序直接在调用它们的代码内部定义时,代码看起来更加独立和可读。您可以以几乎顺序的方式阅读代码,而不必去查找具有该名称的函数。

我确实尝试避免匿名函数的深层嵌套,因为这可能很难理解和阅读。通常,当发生这种情况时,有更好的方法来构造代码(有时使用循环,有时使用数据表等......),并且命名函数通常也不是解决方案。

我想我要补充一点,如果回调开始超过大约 15-20 行长,并且不需要直接访问父作用域中的变量,我会很想给它一个名称并将其分解为它是在其他地方声明的自己的命名函数。这里肯定有一个可读性点,即一个很长的不平凡的函数如果放在自己的命名单元中就更容易维护。但是,我最终得到的大多数回调都没有那么长,而且我发现将它们保持内联更具可读性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 事件代码中使用匿名函数而不是命名函数进行回调和参数有什么好处? 的相关文章

随机推荐

  • java中如何替换空值空字符串? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我得到了null来自数据库的值 但我
  • Highchart 在 x 轴上显示字符串

    我试图将我的 x 轴值显示为系列的 highcharts 上的字符串 但得到 0 1 2 这是 xaxis 数组索引位置 如何在 higcharts 上显示格式化为字符串的 xaxis 值 这是我所拥有的 Highcharts chart
  • 最后命名的参数不是函数或数组?

    这个问题是关于 vararg 函数 以及省略号之前的最后一个命名参数 void f Type paramN va list ap va start ap paramN va end ap 我在阅读 C 标准时 发现了以下限制va start
  • Django 内联-允许添加禁用编辑

    你好 我在阅读以下问题后提出这个问题 问题 1 https stackoverflow com q 2951781 1095090 and 问题2 https stackoverflow com q 9504371 Question 1 没
  • 查看 pandas 系列的每一行中是否有项目

    我有一个包含以下数据的 pandas 系列 2015 07 24 Business Corporate 2015 07 24 Business Corporate 2015 07 08 Commentary World 2015 07 05
  • 具有静态成员的静态结构

    今天 我发现自己创建了一个 2 个 int 的静态数组 并且由于 C 不是 C 11 中不允许其内联初始化 因此我恢复使用 struct 类型的静态变量 class MyWidget static const struct Margin c
  • Nest.Js 不接受任何更改

    我尝试在里面创建一个新方法应用程序控制器但它没有反映变化 我什至尝试更改默认值获取你好 方法 但它正在输出 你好世界 这怎么可能 Insomnia 应用程序控制器 应用服务 Update npm run build npm run star
  • 将值从 servlet 传递到 html [重复]

    这个问题在这里已经有答案了 我有一个 Servlet 它处理来自 Web 的一些内容并生成一个字符串值 我需要在 html 页面的表标记内显示此字符串值 如何使用 setAttribute 方法和 getrequestdispatcher
  • 异常:将数据发布到 Google Pub/Sub 时出现 503 无法连接到所有地址

    我正在使用 Google Pub Sub 教程中的示例代码 当尝试发布消息时 抛出异常 503无法连接到所有地址 我向服务帐户授予了 Pub Sub 发布者角色 直到前天一切都运转良好 从控制台或 gcloud 命令发布消息时没有问题 Cl
  • Azure架构设计

    我是 Azure 新手 对 blob 存储有点困惑 我需要客户端通过 FTP SFTP 访问来推送和拉取文件 XML CSV EDI 等 推送的文件由 net 应用程序读入并写入数据库 据我了解 我们将使用 VM 角色来创建 FTP SFT
  • 将文件插入 mysql Blob

    我尝试在 blob 字段上插入 Open Office 文档 为此我尝试 INSERT INTO my table stamp docFile VALUES NOW LOAD FILE tmp my file odt 这在 Windows
  • 如何循环使用多个关键帧定义的 CSS 动画?

    问题 我有两个 css 关键帧动画 它们在单个元素上运行 fade bg animation name fade bg 1 fade bg 2 animation delay 0 6s animation iteration count i
  • 在 Java 中创建 JSONArray

    我如何创建 JSONArray 因为创建 JSONObject 非常简单 JSONObject j new JSONObject j put key value 现在我可以在 JSONObject 中放入另一个字符串 或者 JSONObje
  • LaTeX:在页边空白处排版章节号

    我正在尝试用 LaTeX 排版一些东西 我想知道我做得是否正确 基本思想是节号挂在左边距 对于章节标题 该数字采用标题的高度 2 行 对于节标题 该数字采用 1 行 并且与小节的标题高度相同 并且与标题的顶部对齐 请参阅下图以了解我在说什么
  • Capistrano 和环境变量

    我已经改用配置的环境变量 http 12factor net config它工作得很好 除非我必须使用 capistrano 部署或运行 任务 Capistrano 3 似乎执行每个带有前缀的命令 usr bin env这会删除我设置的所有
  • 如果我将代码添加到(不相关的)打印部分,“用于测量执行周期的双线程计数器模型”会更改输出

    标题有点晦涩难懂 解释如下 我有 2 线程模型 1 个线程正在繁忙循环内递增变量 另一个线程读取计数器t1 进行测量 再次读取计数器t2并将差异存储在数组中以供将来打印 你为什么不使用rdtscp 它正在序列化 并且已经作为指令内置在硬件中
  • Android - 将 URL 中的图像保存到 SD 卡上

    我想将 URL 中的图像保存到 SD 卡 以供将来使用 然后从 SD 卡加载该图像以将其用作 Google 地图的可绘制叠加层 这是该函数的保存部分 SAVE TO FILE String filepath Environment getE
  • usort() 排序算法如何工作?

    我有一个 usort 示例 我添加了一些 echo 语句来查看代码如何工作
  • 网络RTC。不显示视频

    我决定研究WebRTC 但不展示视频 请帮助 我究竟做错了什么 使用 Chrome 我的代码
  • 在 JavaScript 事件代码中使用匿名函数而不是命名函数进行回调和参数有什么好处?

    我对 JavaScript 还很陌生 我了解该语言的许多概念 我一直在阅读原型继承模型 并且我正在通过越来越多的交互式前端内容来磨练我的口哨 这是一种有趣的语言 但我总是对回调意大利面条有点反感 这是许多重要交互模型的典型特征 我一直觉得奇