Ответ 1
if( val == 'bar' ) {
throw $break;
}
Он задокументирован на той же странице, с которой вы связались. Это исключение, специально обработанное каждой функцией. При броске он не позволяет вашей функции вызываться на других элементах.
В этом очень надуманном примере у меня есть массив с тремя элементами, которые я перебираю с помощью метода . each().
var vals = $w('foo bar baz');
vals.each( function(val) {
alert(val);
if( val == 'bar' ) {
//This exits function(val)
//but still continues with the .each()
return;
}
});
Я могу легко вернуться из функции, вызываемой .each(), если мне нужно.
Мой вопрос: как я могу вырваться из цикла .each() изнутри функции, которую вызывает .each()?
if( val == 'bar' ) {
throw $break;
}
Он задокументирован на той же странице, с которой вы связались. Это исключение, специально обработанное каждой функцией. При броске он не позволяет вашей функции вызываться на других элементах.
Вы правы, и Prototype создал объект ($break), который может быть сброшен из каждой функции, чтобы включить эту функцию. В соответствии с документами Prototype API:
Регулярные циклы могут быть закорочены в JavaScript с использованием операторов break и continue. Однако при использовании функций итератора ваш код выходит за пределы области цикла: код цикла происходит за сценой.
Чтобы предоставить вам эквивалентную (хотя и менее оптимальную) функциональность, Prototype предоставляет два глобальных объекта исключения, $break и $continue. Выбрасывание их эквивалентно использованию соответствующего нативного оператора в петле ванили. Эти исключения должным образом пойманы внутри каждого метода.
Кроме того, обратите внимание, что объект $continue устарел, и для имитации оператора continue вместо него используйте оператор return.
Пример кода:
var result = [];
$R(1,10).each(function(n) {
if (0 == n % 2)
return; // this equals continue
if (n > 6)
throw $break;
result.push(n);
});
// result -> [1, 3, 5]
Подробнее о каждой функции вы можете узнать здесь: http://www.prototypejs.org/api/enumerable/each
На основе документации для .each()
, с которой вы связались, вы должны использовать оператор throw $break;
, это должно привести к прекращению итераций.
Простое возвращение приведет к тому, что итератор продолжит переход к следующему.
С той страницы, с которой вы связались, не является правильным способом
if(val == 'bar')
{
throw $break;
}
?