При DOM-операциях перебор массива объектов является довольно типичной задачей. Давайте предположим, что вы разрабатываете HTML-приложение, которое индексирует содержание страниц. Нашей задачей является сбор всех элементов h1
на текущей странице, чтобы затем использовать их в проиндексированном массиве.
Ниже приведен пример того, как это можно осуществить:
function Iterate(aEntries) { for (var i=0; i < document.getElementsByTagName(‘h1’).length; i++) { aEntries[aEntries.length] = document.getElementsByTagName(‘h1’)[i].innerText; } }
Что плохого в приведенном примере? Он содержит два обращения к массиву document.getElementsByTagName(‘h1’)
на каждой итерации. Внутри цикла наш скрипт будет:
innerText
для текущего элемента в массиве.Это совершенно не эффективно. Дополнительные вычисления, связанные с многочисленными ненужными обращениями к DOM-дереву для получения информации, которую мы и так знаем, являются совершенно лишними. Давайте рассмотрим следующую модификацию этого скрипта:
function Iterate2(aEntries) { var oH1 = document.getElementsByTagName(‘h1’); var iLength = oH1.length; for (var i=0; i < iLength; i++) { aEntries[aEntries.length] = oH1(i).innerText; } }
Таким образом, мы кэшируем DOM-массив в локальную переменную, и затем все действия над ней производятся гораздо быстрее. N обращений к DOM-дереву превращается всего в одно-единственное в результате использования кэширования.