Page 225 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 225
которая в основном ничего не делает. Таким образом, если вы передаете ей 5, она
возвращает 5, и т.д. Есть более эффективные способы справиться с этой ситуаци
ей (такой, как вызов другой функции без дополнительных затрат на вызов пустой
функции для каждого элемента), но это хорошая практика, чтобы научиться созда
вать "безопасные" функции таким способом.
В озвращ е н и е функции из функции
Возвращение функции из функции является, вероятно, не только самым загадоч
ным способом использования функций, но и чрезвычайно полезным. Это можно
сравнить с трехмерным принтером: это вещь, которая делает нечто (как функция),
что может, в свою очередь, делать нечто, что также делает что-то. Но самая захваты
вающая часть здесь в том, что функция, которую вы возвращаете, может быть видо
изменена - очень похоже на то, как вы можете изменить то, что печатаете на трех
мерном принтере.
Давайте предположим, что нашей функции sum, как и ранее, может передаваться
(а может и нет!) функция для обработки каждого элемента массива, до того, как они
будут просуммированы. Помните, как мы упоминали, что могли бы создать отдельную
функцию sumOfSquares, если бы захотели? Давайте рассмотрим ситуацию в которой
такая функция необходима, т.е. когда передавать в функцию и массив и другую функ
цию нежелательно. Нам явно нужна функция, которой передается только один массив
значений, а она возвращает сумму его квадратов. (Если вы задаетесь вопросом, когда
такое обстоятельство могло бы возникнуть, рассмотрите проект некого API, в котором
вам разрешено создавать функции типа sum, только с одним аргументом.)
Один из подходов подразумевает создание новой функции, которая просто вы
зывает нашу старую функцию.
function sumOfSquares a rr) {
(
return sum ( a rr, х => х * х ) ;
Данный подход, конечно, прекрасен и вполне может сработать, если все, что не
обходимо, - это одна функция, но что если необходимо повторять этот шаблон раз
за разом? Решением нашей проблемы могло бы быть создание функции, которая воз
вращает специализированную функцию.
function newSummer ( f ) {
return arr => sum ( a rr, f ) ;
Эта новая функция, newSummer, создает совершенно новый вариант функции sum,
которая имеет только один аргумент, но в ней используется специальная функция.
Давайте рассмотрим, как мы могли бы использовать это для получения различных
видов сумм.
228 Глава 1 3 . Функции и мощь абстрактного мышления

