В обычной ситуации управление доходит до конца блока try , а затем переходит к блоку finally , который выполняет необходимые заключительные операции. Если управление вышло из блока try как результат выполнения инструкций return , continue или break , перед передачей управления в другое место выполняется блок finally .
Если в блоке try возникает исключение и имеется соответствующий блок catch для его обработки, управление сначала передается в блок catch , а затем - в блок finally . Если отсутствует локальный блок catch , то управление сначала передается в блок finally , а затем переходит на ближайший внешний блок catch , который может обработать исключение.
Если сам блок finally передает управление с помощью инструкции return , continue , break или throw или путем вызова метода, генерирующего исключение, незаконченная команда на передачу управления отменяется и выполняется новая. Например, если блок finally сгенерирует исключение, это исключение заменит любое ранее сгенерированное исключение. Если в блоке finally имеется инструкция return , произойдет нормальный выход из метода, даже если генерировалось исключение, которое не было обработано.
Конструкции try и finally могут использоваться вместе без конструкции сatch . В этом случае блок finally - это просто набор инструкций, выполняющих заключительные операции, который будет гарантированно выполнен независимо от наличия в блоке try инструкции break , continue или return . Напомню, из-за различий в работе инструкции continue в разных циклах невозможно написать цикл while , полностью имитирующий работу цикла for . Однако если добавить инструкцию try/finally , можно написать цикл while , который будет действовать точно так же, как цикл for , и корректно обрабатывать инструкцию continue :
// Имитация цикла for( инициализация ; проверка ; инкремент ) тело цикла;
инициализация ;
while( проверка ) {
try { тело цикла ; }
finally { инкремент ; }
}
Обратите однако внимание, что тело цикла while , содержащее инструкцию break , будет вести себя несколько иначе (из-за выполнения лишней операции инкремента перед выходом), чем тело цикла for , поэтому даже используя конструкцию finally , невозможно точно сымитировать цикл for с помощью цикла while .
В этом разделе описываются три остальные инструкции языка JavaScript - with , debugger и use strict .
В разделе 3.10.3 мы обсуждали область видимости переменных и цепочки областей видимости - список объектов, в которых выполняется поиск при разрешении имен переменных. Инструкция with используется для временного изменения цепочки областей видимости. Она имеет следующий синтаксис:
with (объект) инструкция
Эта инструкция добавляет объект в начало цепочки областей видимости, выполняет инструкцию, а затем восстанавливает первоначальное состояние цепочки.
Инструкция with не может использоваться в строгом режиме (раздел 5.7.3) и не рекомендуется к использованию в нестрогом режиме: избегайте ее использования по мере возможности. Программный код JavaScript, в котором используется инструкция with , сложнее поддается оптимизации и наверняка будет работать медленнее, чем эквивалентный программный код без инструкции with .
На практике инструкция with упрощает работу с глубоко вложенными иерархиями объектов. В клиентском JavaScript вам наверняка придется вводить выражения, как показано ниже, чтобы обратиться к элементам HTML-формы:
document.forms[0].address.value
Если подобные выражения потребуется записать много раз, можно воспользоваться инструкцией with , чтобы добавить объект формы в цепочку областей видимости:
Читать дальше
Конец ознакомительного отрывка
Купить книгу