Page 220 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 220
} , ( 5 - i ) * 1 0 0 0 ) ;
} ) ( i ) ;
Как много скобок! Если проанализировать их, то можно заметить, что здесь про
исходит то же самое: мы создаем функцию, которой передается один аргумент, и она
вызывается на каждом шаге цикла (рис. 1 3 . 1 ) .
var i ;
O
for( i =S ; i> ; i-- ) {
( f unction( i ) {
setTimeout ( f unction ( ) {
var i ; console. log ( i===O ? "Старт! " i ) ;
O
for( i =S ; i> ; i-- ) { } , ( 5 -i ) * lOOO ) ;
y
loopBod ( i ) ; } ) ( i ) ;
} }
Вызов именованной функции заменен анонимной
Рис. 13. 1 . Немедленно вызываемое функциональное выражение
Переменные области видимости блока решают эту задачу без введения дополни
тельной функции, чтобы создать новую область видимости. Использование перемен -
ных области видимости блока существенно упрощает этот пример.
for ( l et i=5 ; i > O ; i - - ) (
setTimeout ( f unction ( )
console . l og ( i===O ? "Старт ! " i ) ;
} , ( 5 - i ) * 1 0 0 0 ) ;
Обратите внимание, что мы используем ключевое слово let в аргументах цикла
for. Если бы мы поместили его вне цикла for, у нас была бы та же проблема, что
и прежде. Таким образом, использование ключевого слова let сообщает JavaScript,
что на каждом этапе цикла должна быть новая, независимая копия переменной i .
В результате, когда функции, переданные s e t T i meout, выполняются в будущем,
они каждый раз получают свое значение переменной в ее собственной области ви
димости.
и
П е ременные функц й
Если вы новичок в программировании, можете налить себе еще кофе2 и усесть
ся поудобнее: в этом разделе рассматривается концепция, которая очень важна, но
у новичков зачастую вызывает затруднения.
2 Имеется в виду композиция "Another Cup of Coffe e" группы Mike And The Mechanics. - П р имеч. ред.
Переменные функций 223

