JS函数调用的价格(与为变量分配内存相比)有多昂贵?
时间:2020-03-06 14:32:24 来源:igfitidea点击:
给定一些这样的JS代码:
for (var i = 0; i < document.getElementsByName('scale_select').length; i++) { document.getElementsByName('scale_select')[i].onclick = vSetScale; }
如果将getElementsByName的结果放入循环之前的变量,然后在循环之后使用该变量,代码会更快吗?
我不确定现实生活中的效果有多大,getElementsByName
的结果通常少于10个。无论如何,我还是想了解底层的机制。
另外,如果关于这两个选项还有其他值得注意的地方,请告诉我。
解决方案
In principle, would the code be faster if we put the result of getElementsByName into a variable before the loop and then use the variable after that?
是的。
我想是这样。每次循环时,引擎都需要重新评估document.getElementsByName语句。
另一方面,如果将该值保存在变量中,则该值已经具有该值。
确实。存储所需的内存仅是指向DOM对象的指针,并且与每次需要使用某些东西进行DOM搜索相比,痛苦要轻得多!
理想代码:
var scale_select = document.getElementsByName('scale_select'); for (var i = 0; i < scale_select.length; i++) scale_select[i].onclick = vSetScale;
使用变量。它们在JavaScript中不是很昂贵,并且函数调用肯定较慢。如果在document.getElementById()上循环至少5次,请使用一个变量。这里的想法不仅是函数调用缓慢,而且此特定函数在尝试在DOM中定位具有给定id的元素时也非常慢。
DOM的智能实现将进行自己的缓存,从而在发生某些更改时使缓存无效。但是,今天并不是所有的DOM都可以算是这种聪明的(咳嗽IE咳嗽),所以最好自己动手做。
缓存属性查找可能会有所帮助,但是事实证明,在开始循环之前缓存数组的长度会更快。
因此,在循环中声明一个包含scale_select.length值的变量会加快整个循环的速度。
var scale_select = document.getElementsByName('scale_select'); for (var i = 0, al=scale_select.length; i < al; i++) scale_select[i].onclick = vSetScale;
@奥利
缓存从变量中获取的元素的length属性也是一个好主意:
var scaleSelect = document.getElementsByName('scale_select'); var scaleSelectLength = scaleSelect.length; for (var i = 0; i < scaleSelectLength; i += 1) { // scaleSelect[i] }
没有必要将scaleSelect.length存储在一个单独的变量中。它实际上已经在一个scaleSelect中。length只是scaleSelect数组的一个属性,因此,它与任何其他静态变量一样快地访问。