Neste tutorial, você aprenderá sobre fechamentos de JavaScript com a ajuda de exemplos.
Antes de aprender sobre fechamentos, você precisa entender dois conceitos:
- Função Aninhada
- Retornando uma função
Função aninhada de JavaScript
Em JavaScript, uma função também pode conter outra função. Isso é chamado de função aninhada. Por exemplo,
// nested function example // outer function function greet(name) ( // inner function function displayName() ( console.log('Hi' + ' ' + name); ) // calling inner function displayName(); ) // calling outer function greet('John'); // Hi John
No programa acima, a greet()
função contém a displayName()
função dentro dela.
Retornando uma função
Em JavaScript, você também pode retornar uma função dentro de uma função. Por exemplo,
function greet(name) ( function displayName() ( console.log('Hi' + ' ' + name); ) // returning a function return displayName; ) const g1 = greet('John'); console.log(g1); // returns the function definition g1(); // calling the function
Resultado
function displayName () (console.log ('Hi' + '' + nome);) Olá John
No programa acima, a greet()
função está retornando a displayName
definição da função.
Aqui, a definição da função retornada é atribuída à variável g1. Ao imprimir g1 usando console.log(g1)
, você obterá a definição da função.
Para chamar a função armazenada na variável g1, usamos g1()
com parênteses.
Fechamentos de JavaScript
Em JavaScript, o fechamento fornece acesso ao escopo externo de uma função de dentro da função interna, mesmo após o fechamento da função externa. Por exemplo,
// javascript closure example // outer function function greet() ( // variable defined outside the inner function let name = 'John'; // inner function function displayName() ( // accessing name variable return 'Hi' + ' ' + name; ) return displayName; ) const g1 = greet(); console.log(g1); // returns the function definition console.log(g1()); // returns the value
Resultado
function displayName () (// acessando a variável de nome return 'Hi' + '' + name;) Hi John
No exemplo acima, quando a greet()
função é chamada, ela retorna a definição da função de displayName
.
Aqui, g1
está uma referência à displayName()
função.
Quando g1()
é chamado, ainda tem acesso à greet()
função.
Quando executamos console.log(g1)
, ele retorna a definição da função.
O conceito de encerramento existe para outras linguagens de programação como Python, Swift, Ruby, etc.
Vamos dar uma olhada em outro exemplo.
// closure example function calculate(x) ( function multiply(y) ( return x * y; ) return multiply; ) const multiply3 = calculate(3); const multiply4 = calculate(4); console.log(multiply3); // returns calculate function definition console.log(multiply3()); // NaN console.log(multiply3(6)); // 18 console.log(multiply4(2)); // 8
No programa acima, a calculate()
função recebe um único argumento x
e retorna a definição da multiply()
função da função. A multiply()
função recebe um único argumento y
e retorna x * y
.
Ambos multiply3
e multiply4
são encerramentos.
A calculate()
função é chamada de passagem de parâmetro x
. Quando multiply3
e multiply4
são chamados, a multipy()
função tem acesso ao argumento x passado da calculate()
função externa .
Dados privados
O fechamento do JavaScript ajuda na privacidade dos dados do programa. Por exemplo,
let a = 0; function sum() ( function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) const x = sum(); console.log(x()); // 1 console.log(x()); // 2 console.log(x()); // 3 a = a + 1; console.log(a); // 4
No exemplo acima, a sum()
função retorna a definição da increaseSum()
função da função.
A variável a é aumentada dentro da increaseSum()
função. No entanto, o valor da variável a também pode ser alterado fora da função. Nesse caso, a = a + 1;
altera o valor da variável fora da função.
Agora, se você quiser que a variável a seja aumentada apenas dentro da função, você pode usar um encerramento. Por exemplo,
function sum() ( let a = 0; function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) let x = sum(); let a = 5; console.log(x()); // 1 console.log(x()); // 2 console.log(a); // 5
No exemplo acima, a sum()
função define o valor de a como 0 e retorna a increaseSum()
função.
Por causa do fechamento, mesmo que sum()
já seja executado, increaseSum()
ainda tem acesso a a e pode adicionar 1 a a cada vez que x()
for chamado.
E a variável a é privada para a sum()
função. Isso significa que a variável a só pode ser acessada dentro da sum()
função.
Mesmo que você o declare a
e use, ele não afeta a a
variável dentro da sum()
função.
Observação : geralmente, os fechamentos são usados para privacidade de dados.