读取(但不分配)一个属性:把戏还是没用? [复制]

Posted

技术标签:

【中文标题】读取(但不分配)一个属性:把戏还是没用? [复制]【英文标题】:Read (but not assign) a property: trick or useless? [duplicate] 【发布时间】:2015-12-07 18:55:16 【问题描述】:

在一个现有的应用程序中,我只是对以下代码感到:

function _repaint(elem) 
    elem.style.display = 'none';
    elem.offsetHeight; // jshint ignore:line
    elem.style.display = '';

第二行对我来说似乎完全没用,删除它时我没有注意到应用程序有任何变化。然而,jshint 会自动忽略它。那么,我想知道它的目的是什么?

javascript 引擎不会删除这条无用的行进行优化吗?

【问题讨论】:

因为它是一个 DOM 属性,当它被访问时可能会发生一些神奇的事情。就像它迫使渲染引擎重新计算布局,因为上一行改变了 CSS。 如果此代码在 git(或其他源版本系统)中,您需要寻找负责人找出答案:) ***.com/a/3485654/2182767 - 诡计! :) 但这是 2010 年的问题,我不知道它在 2015 年是否有效 如果一个属性有一个getter函数,当访问该属性时会调用该函数,即使该值没有被使用。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 写那句话的人应该被拿出来,用湿意大利面狠狠地揍一顿。为什么?因为这是一个注释不是可选的上下文。不可原谅没有// WebKit bug workaround: http://***.com/questions/3485365/ 或类似名称。 【参考方案1】:

第二行

elem.offsetHeight;

似乎没有任何影响,但实际上它有一个巨大的影响:计算任何元素的.offsetHeight 会强制浏览器重新绘制/重排整个文档。这可能是针对某些特定平台/设备上一些晦涩的浏览器错误的 hack。

编辑:如果您确定该错误不再存在,或者它无关紧要,因为您在需要时不再支持该平台,我建议删除此行(特别是如果它被称为 many次)。这是一项代价高昂的操作,出于性能原因应该避免。

【讨论】:

以上是关于读取(但不分配)一个属性:把戏还是没用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

让 Maven2 将资源复制到构建目录,但不将它们捆绑在 JAR 中

如何在 Subversion 存储库之间复制保留属性但不保留历史记录

如何逐字读取文件并将这些单词分配给结构? [复制]

如何设置vm虚拟机中的xp系统只能读取主机文件,不能在共享的主机文件夹中新建或删除或复制。

如何一次读取一个字符的字符串或文件并将该字符的 ASCII 值分配给 CMD 批处理中的变量? [复制]

结构中的快速类在分配期间是不是通过副本传递?