CreateMultiplier: примеры (JAVASCRIPT)
createMultiplier(factor (number)): functionФункция createMultiplier в JavaScript
Функция createMultiplier является примером функции высшего порядка. Она используется для генерации новых функций, которые умножают входное значение на заданный коэффициент. Основная цель — создание переиспользуемых и специализированных функций умножения без дублирования кода.
Аргументы: функция принимает один обязательный параметр — множитель (multiplier), число, на которое будет умножаться значение. Некоторые реализации могут принимать второй параметр — обратное умножение (inverse), булевый флаг, указывающий, нужно ли возвращать функцию для деления на множитель.
Возвращаемое значение: всегда возвращается новая функция (замыкание), которая принимает один аргумент — число, и возвращает результат умножения (или деления) этого числа на сохранённый множитель.
Примеры использования
Пример 1: Базовое умножение
function createMultiplier(factor) {
return function(x) {
return x * factor;
};
}
const double = createMultiplier(2);
console.log(double(5));10
Пример 2: С флагом inverse
function createMultiplier(factor, inverse = false) {
return function(x) {
return inverse ? x / factor : x * factor;
};
}
const halve = createMultiplier(2, true);
console.log(halve(10));5
Пример 3: Возврат разных типов
const triple = createMultiplier(3);
console.log(triple(4.5));
console.log(triple('a'));13.5 NaN
Похожие функции в JavaScript
Function.bind(): Частичное применение аргументов. Позволяет зафиксировать контекст this и первые аргументы функции. Предпочтительнее, когда требуется сохранить контекст выполнения.
Каррирование (currying): Преобразование функции с несколькими аргументами в последовательность функций с одним аргументом. Полезно для более гибкого частичного применения, чем createMultiplier.
Замыкания с несколькими параметрами: Создание функций с предустановленными несколькими значениями. Используется, когда нужно зафиксировать больше одного параметра.
Альтернативы в других языках
Python (лямбда-функции)
def create_multiplier(factor):
return lambda x: x * factor
double = create_multiplier(2)
print(double(5))10
PHP (анонимные функции)
function createMultiplier($factor) {
return function($x) use ($factor) {
return $x * $factor;
};
}
$double = createMultiplier(2);
echo $double(5);10
C (указатели на функции)
#include <stdio.h>
typedef int (*multiplier_func)(int);
multiplier_func createMultiplier(int factor) {
int multiplier(int x) {
return x * factor;
}
return multiplier; // В стандартном C вложенные функции не возвращаются.
}
// Реализация через структуры или статические переменные сложнее.Основное отличие в C — отсутствие полноценных замыканий, требуется ручное управление памятью.
Типичные ошибки
1. Неправильное использование замыканий в циклах
const multipliers = [];
for (var i = 0; i < 5; i++) {
multipliers.push(createMultiplier(i));
}
console.log(multipliers[2](10)); // Ожидается 2040 // Ошибка: все замыкания используют последнее значение i=4.
Решение: использовать let вместо var.
2. Передача нечислового множителя
const invalid = createMultiplier('abc');
console.log(invalid(10));NaN
3. Потеря контекста this
const obj = {
factor: 3,
getMultiplier: function() {
return createMultiplier(this.factor);
}
};
const multiplier = obj.getMultiplier(); // Если factor не передан явно, будет ошибка.История изменений
Функция createMultiplier не является частью спецификации ECMAScript, а представляет собой шаблон кода. С развитием стандарта JavaScript её реализация стала лаконичнее благодаря стрелочным функциям в ES6 (2015).
Раньше использовались function выражения, теперь чаще применяются стрелочные функции, что делает код короче и сохраняет лексический this.
Расширенные примеры
Пример 1: Композиция функций
const double = createMultiplier(2);
const triple = createMultiplier(3);
const composed = (x) => triple(double(x));
console.log(composed(5));30
Пример 2: Мемоизация результатов
function createCachedMultiplier(factor) {
const cache = new Map();
return function(x) {
if (!cache.has(x)) {
cache.set(x, x * factor);
}
return cache.get(x);
};
}
const cachedDouble = createCachedMultiplier(2);
console.log(cachedDouble(5));
console.log(cachedDouble(5)); // Взято из кеша10 10
Пример 3: Использование в методах массива
const scaleArray = (arr, factor) => arr.map(createMultiplier(factor));
console.log(scaleArray([1, 2, 3], 2.5));[2.5, 5, 7.5]
Пример 4: Фабрика с состоянием
function createMultiplierWithCounter(factor) {
let callCount = 0;
return {
multiply: function(x) {
callCount++;
return x * factor;
},
getCallCount: () => callCount
};
}
const multiplier = createMultiplierWithCounter(10);
console.log(multiplier.multiply(3));
console.log(multiplier.getCallCount());30 1