CreateMultiplier: примеры (JAVASCRIPT)

Шаблон createMultiplier для генерации функций умножения
Раздел: Примеры кода, Замыкания
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)); // Ожидается 20
40 // Ошибка: все замыкания используют последнее значение 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: Композиция функций

Пример javascript
const double = createMultiplier(2);
const triple = createMultiplier(3);
const composed = (x) => triple(double(x));
console.log(composed(5));
30

Пример 2: Мемоизация результатов

Пример javascript
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: Использование в методах массива

Пример javascript
const scaleArray = (arr, factor) => arr.map(createMultiplier(factor));
console.log(scaleArray([1, 2, 3], 2.5));
[2.5, 5, 7.5]

Пример 4: Фабрика с состоянием

Пример javascript
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

JS createMultiplier function comments

En
CreateMultiplier Returns a function that multiplies by a fixed factor