HOWTO · JavaScript
Funções aninhadas em JavaScript
Este tutorial demonstra funções aninhadas em JavaScript.
Nesta página
Uma função aninhada é definida dentro de outra função. A função externa determina onde a função interna está disponível, e a função interna pode ler variáveis do escopo em que foi criada. Este guia mostra como definir e chamar uma função aninhada, por que o acesso a variáveis externas pode ser útil e como manter esse padrão legível.
O que são funções aninhadas?
Em JavaScript, uma função interna pode usar parâmetros e variáveis locais da função externa. Se continuar acessível depois que a função externa retornar, ela mantém acesso às variáveis que referencia. Essa combinação entre uma função e o acesso léxico que ela preserva é chamada de closure.
Execute este exemplo:
function makeAdder(amount) {
return function add(value) {
return amount + value;
};
}
const addFive = makeAdder(5);
console.log(addFive(10));
15
O resultado de execução fornecido é 15. makeAdder(5) retorna a função interna, que em seguida é chamada com 10; a função interna lê amount do escopo léxico da chamada externa. Retornar uma função interna é um padrão comum de closure. Isso não é automaticamente currying: currying transforma especificamente uma função que aceita vários argumentos em uma sequência de funções que aceitam um argumento cada.
Vantagens de usar funções aninhadas
Aninhar uma função mantém uma função auxiliar perto do código que a utiliza e evita acrescentar um nome ao escopo ao redor. Uma função interna retornada também pode manter estado privado entre chamadas. Por exemplo, uma fábrica de contadores pode criar uma variável local count e retornar uma função que a atualiza. Cada chamada à fábrica cria seu próprio vínculo, permitindo que contadores diferentes mantenham estados independentes. Closures possibilitam esse comportamento, mas não garantem uma execução mais rápida.
Uma função interna pode acessar variáveis externas, mas isso não torna toda callback uma função aninhada. Uma callback definida em outro lugar e passada a uma função é uma callback de uma função de ordem superior; ela só é aninhada se sua definição estiver dentro de outra função.
Quando usar funções aninhadas
Use uma função aninhada quando ela precisar de valores ou do escopo da função externa, quando uma função auxiliar só fizer sentido nesse contexto ou quando você quiser criar uma função configurada com um valor, como um multiplicador. Ao retornar essa função configurada, os chamadores podem reutilizar a configuração sem passá-la a cada chamada.
Se a função auxiliar não precisar das variáveis nem do escopo da função externa, defini-la em um escopo mais amplo pode facilitar sua reutilização e seus testes. Escolha o aninhamento quando ele deixar clara a relação entre as funções ou permitir preservar estado, e não apenas porque é possível colocar uma função dentro de outra.
Boas práticas para funções aninhadas
Mantenha cada função focada e escolha nomes que expliquem a relação entre a configuração externa e a ação interna. Evite níveis de aninhamento que dificultem acompanhar o fluxo do código; extraia uma função auxiliar quando ela puder funcionar por conta própria ou quando a função que a contém ficar difícil de ler rapidamente.
Uma closure mantém acesso ao ambiente léxico enquanto continuar acessível. Esse comportamento é normal e não é motivo para evitar closures de forma geral. Em código de longa duração, evite manter uma closure acessível por mais tempo do que o necessário se ela também mantiver objetos grandes acessíveis.
Conclusão
Uma função aninhada é definida dentro de outra função e pode usar as variáveis da função externa por meio do escopo léxico. Quando é retornada, pode preservar esse acesso como uma closure, permitindo manter estado privado e reutilizar uma configuração. Use esse padrão quando a relação entre as funções deixar o código mais claro e reduza o aninhamento quando ele dificultar a compreensão.
Perguntas frequentes
- O que são funções aninhadas em JavaScript? Uma função aninhada é definida dentro de outra função e pode acessar variáveis do escopo léxico externo.
- Por que usar funções aninhadas? Elas podem manter funções auxiliares locais, preservar estado em uma closure ou criar funções configuradas com um valor externo. Por si só, não melhoram o desempenho.
- Funções aninhadas podem acessar variáveis da função externa? Sim. Uma função interna pode ler variáveis do seu escopo léxico, inclusive depois que a função externa retorna, se a função interna continuar acessível.
- Qual é uma desvantagem das funções aninhadas? O aninhamento excessivo pode dificultar a leitura e a manutenção do código.
- Como usar funções aninhadas bem? Mantenha-as focadas, dê nomes claros a elas e defina uma função auxiliar em um escopo mais amplo quando ela não precisar do escopo que a contém.