Page 218 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 218
найти способ использовать чистую функцию вместо нее. Со временем вы, естествен
но, будете стремиться к чистым функциям.
Объектно-ориентированное программирование, которое мы рассматривали в гла
ве 9, предоставляет парадигму, позволяющую использовать побочные эффекты кон
тролированным и разумным способом за счет ограничения их области видимости.
Функции являются объектами
В JavaScript функции являются экземплярами объекта Function. С практической
точки зрения это никак не влияет на то, как вы их используете; это просто информа
ция к размышлению. Заслуживает внимания то, что, если вы попытаетесь идентифи
цировать тип переменной v, оператор typeof v возвратит для функций " f unction".
Это весьма разумно, в отличие от случая, когда v является массивом: он возвра
тит " o bj ect" . В результате вы можете использовать оператор typeof v для иден
тификации функции. Обратите, однако, внимание, что если v - это функция, то
v instanceof Obj ect даст истину. Поэтому, если вам нужно отличать функции
от объектов других типов, то для проверки сначала используйте оператор typeof.
Немедленно вызываемое функциональное
выраж н и е и асинхр н н ы й код
о
е
Мы познакомились с немедленно вызываемыми функциональными выражения
ми (IIFE) в главе 6 и увидели, что они позволяют создавать замкнутые выражения.
Давайте рассмотрим важный пример (к которому мы вернемся в главе 14) того, как
IIFE может помочь нам с асинхронным кодом.
Один из первых случаев использования IIFE подразумевает создание новых пе
ременных в новых областях видимости, чтобы асинхронный код выполнялся пра
вильно. Рассмотрим классический пример таймера, который осуществляет обратный
отсчет от 5 секунд до О (команда "Старт ! " ). В этом коде использована встроенная
функция setTimeout, которая задерживает выполнение ее первого аргумента (функ
ции) на второй аргумент (количество миллисекунд). Например, следующий код вы
1
водит строку "Привет ! " через , 5 секунды.
setTimeout ( f unction ( ) { console . l og ( " Привет ! " ) ; } , 1 5 0 0 ) ;
Т е перь, обладая этим знанием, создадим нашу функцию обратного отсчета.
var i ;
for ( i =5 ; i>= O ; i--) {
t
setTimeout ( f unc i on ( )
console . l og ( i===O ? "Старт ! " i ) ;
( 5 -i ) 1 0 0 0 ) ;
*
} ,
Немедленно вызываемое функциональное выражение и асинхронный код 221

