Cześć,
próbuje któryś tydzień ;/ zrozumieć fragment książki
Teraz jednak przeglądana będzie cała tablica, nawet jeśli wartość zostanie znaleziona natychmiast na pierwszej pozycji. Co za marnotrawstwo. W pętli for można zakończyć iterację za pomocą instrukcji break, ale w pętli forEach tak się nie da, ponieważ treść pętli jest funkcją, a instrukcja break nie służy do wychodzenia z funkcji. Jednym z możliwych rozwiązań jest dostosowanie forEach, aby rozpoznawała określony typ wyjątków jako sygnał do przerwania.
var Break = {toString: function() {return "Break";}};
function forEach(array, action) {
try {
for (var i = 0; i < array.length; i++)
action(array[i]);
}
catch (exception) {
if (exception != Break)
throw exception;
}
}
Teraz gdy funkcja action zgłosi wyjątek Break, funkcja forEach go przechwyci i przerwie iterację. Obiekt przechowywany w zmiennej Break jest używany wyłącznie w celach porównawczych. Własność toString dodałem mu po to, aby ułatwić zorientowanie się, co za dziwną wartość otrzymaliśmy, gdy jakimś cudem wyjątek Break pojawi się poza forEach.
Proszę o pomoc w zrozumieniu poniższych:
Teraz gdy funkcja action zgłosi wyjątek Break
czy tu chodzi o taką normalną instrukcję "break;" - czy specjalny obiekt o "mylącej" ;/ nazwie.
drugi fragment:
var FoundSeven = {};
function hasSevenTruths(object) {
var counted = 0;
function count(object) {
for (var name in object) {
if (object[name] === true) {
counted++;
if (counted == 7)
throw FoundSeven;
}
else if (typeof object[name] == "object") {
count(object[name]);
}
}
}
try {
count(object);
return false;
}
catch (exception) {
if (exception != FoundSeven)
throw exception;
return true;
}
}
Wewnętrzna funkcja count jest rekurencyjnie wywoływana dla każdego obiektu będącego częścią argumentu. Gdy wartość zmiennej counted dojdzie do siedmiu, nie ma sensu kontynuować liczenia, ale sam zwrot z bieżącego wywołania funkcji count niekoniecznie zatrzyma liczenie, ponieważ pod nim mogą być jeszcze inne wywołania. Dlatego użyliśmy instrukcji throw, która powoduje wyjście z wywołań funkcji count i przejście do bloku catch.
Jednak zwrócenie jedynie wartości true w przypadku wyjątku jest niepoprawne. Coś innego mogłoby pójść nie tak i dlatego najpierw sprawdzamy, czy wyjątek jest utworzonym specjalnie na tę okazję obiektem FoundSeven. Jeśli nie, ten blok catch nie wie, jak go obsłużyć, a więc ponawia jego zgłoszenie.
Nie rozumiem tego framgentu o ponownym zgłoszeniu - throw w catchu nie wywołuje ponownie bloku catch - tylko wychodzi z niego - czy się myle :( ?
dodanie znaczników <code class="javascript">
- @furious programming