【发布时间】:2020-05-18 09:05:09
【问题描述】:
NB 我已经阅读了一些关于 JS 引擎优化的文章,但其中大部分内容对我来说太技术性了,无法理解到足以适用于这个问题。我也知道并非所有的引擎都是一样的。我想我对 V8 和 Rhino 的处理特别感兴趣。
如果我创建一个表,然后是行,然后是单元格...然后我想在所有这些单元格上放置相同的键事件侦听器。
不仅为每个单元格创建这些侦听器需要一定的时间,这对于一个大表可能很重要,而且我假设每个侦听器函数都是独立存储的,即使每个监听函数其实是一样的。
我可以使用的另一种关键事件侦听器方法是在TABLE 上放置一个关键事件侦听器,并在运行期间计算每个keydown 事件,哪个单元格触发了此事件。我可以这样做
let elementOfInterest = document.activeElement;
“获取文档中当前聚焦的元素”来自here。
根据我的实验,如果您在表格单元格内输入,TD 确实具有焦点,并且确实由上述调用返回。
这样,我只需要创建一个侦听器,我认为它会更快并且占用更少的内存。唯一(非常)轻微的缺点是必须花费时间通过上述调用来获取这个“活动元素”。而且,很可能,某些东西会以意想不到的方式抓住焦点 - 显然,如果你想监听单元格中文本的变化,最不容易出错的技术必须是使用附加到该单元格的监听器。
但我只是想知道:也许 Javascript 比这更聪明:也许如果您创建 100 个单独的单元侦听器,则某处将它们标识为“都一样”,并且只在内存中创建一个函数。例如,这是您通常期望从 Java 编译器获得的优化。
有没有发生过这样的优化?在这样的情况下,Javascript 有多聪明?还是只是“脚本,仅此而已”:所见即所得?
【问题讨论】:
-
您所描述的称为event delegation,通常比拥有多个事件处理程序更受欢迎。我怀疑任何 JavaScript 运行时都足够聪明,总能将重复的事件处理程序减少为一个。
标签: javascript optimization memory-management javascript-engine