Page 224 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 224
Конвейерная обработка нашла применение не только в прикладных програм
мах обработки графики: она популярна и в обработке звука, и во многих научных
и технических приложениях. В действительности каждый раз, когда у вас есть серия
функций, которую нужно выполнять в определенном порядке, конвейер является
весьма полезной абстракцией.
П е редача функции в функцию
Мы уже видели несколько примеров передачи функций в функции: имеется в виду
передача функций в функции setTirneout и forEach. Передача функций в функции
применяется также в асинхронном программировании, которое становится все более
популярным. При обычном способе достижения асинхронного выполнения подраз
умевается передача функций (называемых функциями обратного вызова (callback))
в другую функцию. Эта функция вызывается, когда содержащая функция завершает
свою работу. Мы обсудим обратные вызовы подробнее в главе 1 4 .
Обратный вызов - не единственная причина, по которой вам может понадобиться
передавать функции в другую функцию; это также отличный способ "внедрить" функ
цию. Давайте рассмотрим функцию sum, которая просто суммирует все числа в масси
ве (для простоты мы не будем делать никакой проверки или обработки ошибок, если
массив будет содержать элементы, отличные от числовых). Это достаточно простое
упражнение, но что если затем понадобится функция, которая возвращает сумму ква
дратов'? Конечно, мы просто могли бы написать новую функцию sumOfSquares " " но
что будет, когда понадобится сумма кубов'? Вот где возможность передать функцию
может очень пригодиться. Рассмотрим эту реализацию функции sum.
function sum ( a rr, f ) {
/ / если никакой функции не предоставлено, используется "пустая
11 функция", которая просто возвращает свой аргумент неизменным
i f ( typeof f ! = ' f unction ' ) f = х => х ;
return arr . reduce ( ( a , х) = > а + = f ( x ) , О ) ;
sum ( [ 1 , 2 , 3 ] ) ; 1 1 возвращает б
m
su ( [ l , 2 , 3 ] , х => х*х) ; / / возвращает 1 4
su ( [ l , 2 , 3 ] , х => Math . pow ( x , 3 ) ) ; 1 1 возвращает 3 6
m
При передаче произвольной функции в sum мы можем заставить ее сделать . . все,
.
что хотим. Нужна сумма квадратных корней'? Никаких проблем. Нужна сумма чисел,
возведенных в степень 4,233'? Проще простого. Обратите внимание, что мы хотим
предусмотреть возможность простого вызова функции sum, т.е. не делая ничего спе
циально и не передавая ей никакой функции. В функции параметр f имеет значение
undefined, и если мы попытаемся его вызвать, то получим ошибку. Чтобы предот
вратить это, мы превращаем нечто, не являющееся функцией, в "пустую функцию':
Переменные функций 227

