Обход элементов

Функция forEach передает каждый элемент массива функции, принимающей до трех параметров и не возвращающей никакого значения. Первый параметр – текущий элемент массива, обход которого выполняется, второй параметр (необязательный) – индекс текущего элемента массива и третий параметр – сам массив. Вообще функция forEachиспользуется для обхода всех элементов массива, как если бы это был обычный цикл for. Ниже приводится сигнатура этой функции:
dojo.forEach(/*Array*/ array, /*Function*/ function) // Не возвращает ничего

В простейшем случае функция forEach применяется, как показано ниже:
dojo.forEach([1,2,3], function(x) {
console.log(x);
});

Функция forEach обладает следующими очевидными преимуществами: она меньше загромождает программный код, чем цикл for, для работы которого необходимо еще предусмотреть переменную цикла, и, кроме того, позволяет использовать литералы массивов. Однако самое важное преимущество состоит в том, что на основе функции, определяемой вторым параметром, она позволяет реализовать замыкания, защищая тем самым свой контекст от влияния переменной цикла и любых других переменных, которые могут использоваться в теле цикла.


Как и другие вспомогательные функции, forEach способна принимать дополнительный параметр, определяющий контекст для встроенной функции.

Чтобы продемонстрировать, как функция forEach может обезопасить вас от неожиданностей, рассмотрим следующий фрагмент программ ного кода:
var nodes = getSomeNodes();
for(var x=0; x nodes[x].onclick = function(){
console.debug("clicked:", x);
}
}

Как вы думаете, какое значение переменной x будет здесь полученоПоскольку замыкание выполняется по лексической переменной x, а не по ее значению, во все вызовы функции будет передано последнее значение. Функция forEach предохраняет нас от такого поведения, создавая новую лексическую область видимости. Следующая версия программного кода демонстрирует, как выполнить обход массива и вывести ожидаемое значение:
var nodes = getSomeNodes();
var idx = 0;
dojo.forEach(nodes, function(node, idx){
node.onclick = function(){
console.debug("clicked:", idx);
}
});

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
Аргументы «функции в виде строк»
Блочная модель
Грубое определение типа
Добавление узлов
Зачем управлять беспорядком

Вернуться в раздел: Dojo / Утилиты броузера