Médio JavaScript

Função fábrica de multiplicadores

Enunciado

Crie uma função criarMultiplicador que recebe um número fator e retorna uma função que multiplica seu argumento por fator. Em seguida, use-a para criar dobro e triplo e teste com o valor 5.

Requisitos

  • criarMultiplicador recebe um parâmetro fator.
  • Retorna uma função que recebe um número e retorna o produto fator * numero.
  • Crie dobro e triplo e imprima dobro(5) e triplo(5).

Código inicial

function criarMultiplicador(fator) {
  // seu código aqui
}

const dobro = criarMultiplicador(2);
const triplo = criarMultiplicador(3);
console.log(dobro(5)); // 10
console.log(triplo(5)); // 15

Saída esperada

10
15
Ver dica

A função retornada deve usar o parâmetro fator da função externa.

Mostrar solução
function criarMultiplicador(fator) {
  return function(numero) {
    return fator * numero; // closure captura 'fator'
  };
}

const dobro = criarMultiplicador(2);
const triplo = criarMultiplicador(3);
console.log(dobro(5)); // 10
console.log(triplo(5)); // 15

Passo a passo

  1. criarMultiplicador recebe fator como parâmetro.
  2. Retorna uma função anônima que aceita numero.
  3. Dentro dessa função, multiplica fator por numero. fator é acessado via closure.
  4. dobro é criado com fator = 2; triplo com fator = 3.
  5. Cada função retornada mantém seu próprio fator no ambiente léxico.

Por que funciona

A função interna referencia fator, que está no escopo da função externa. Mesmo após criarMultiplicador retornar, a closure mantém fator vivo. Como cada chamada cria um novo escopo, dobro e triplo têm fatores independentes.

Erros comuns

  • Não retornar a função interna: se esquecer return, dobro será undefined e dobro(5) dará erro.
  • Usar fator como variável global: se fator for global, todas as funções usarão o mesmo valor.
  • Confundir parâmetros: a função retornada deve receber numero, não fator.

Outra forma de resolver

Usar arrow function:

const criarMultiplicador = fator => numero => fator * numero;

Mais conciso, mas menos explícito para iniciantes.

Saída esperada

10
15