读取(但不分配)一个属性:把戏还是没用? [复制]
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系统只能读取主机文件,不能在共享的主机文件夹中新建或删除或复制。