Tutorial de JS

JS HOME Introdução JS JS Para onde Saída JS Declarações JS Sintaxe JS Comentários JS Variáveis ​​JS JS Let JS Const Operadores JS JS Aritmética Atribuição de JS Tipos de dados JS Funções JS Objetos JS Eventos JS Strings JS Métodos de string JS Pesquisa de String JS Modelos de String JS Números JS Métodos de número JS Matrizes JS Métodos de matriz JS Classificação de matriz JS Iteração de matriz JS Const da matriz JS Datas JS Formatos de data JS Métodos de obtenção de data JS Métodos de conjunto de datas JS JS Math JS Aleatório JS Booleanos Comparações JS Condições JS Interruptor JS Circuito JS para JS Loop Para Entrada JS Loop Para De JS Loop Enquanto Quebra de JS Iteráveis ​​JS Conjuntos JS Mapas JS Tipo JS de Conversão de tipo JS JS bit a bit JS RegExp Erros JS Escopo JS Içamento JS Modo estrito JS JS esta palavra-chave Função de seta JS Classes JS JS JSON Depuração JS Guia de estilo JS Práticas recomendadas de JS Erros de JS Desempenho JS Palavras reservadas JS

Versões JS

Versões JS JS 2009 (ES5) JS 2015 (ES6) JS 2016 JS 2017 JS 2018 JS IE / Edge Histórico de JS

Objetos JS

Definições de objeto Propriedades do objeto Métodos de objeto Exibição de objetos Acessadores de objetos Construtores de objetos Protótipos de Objetos Iteráveis ​​de objeto Conjuntos de objetos Mapas de objetos Referência do objeto

Funções JS

Definições de função Parâmetros de função Invocação de função Chamada de Função Função Aplicar Fechamentos de Função

Classes JS

Introdução à aula Herança de classe Classe Estática

JS Assíncrono

Retornos de chamada JS JS Assíncrono Promessas JS JS Async/Aguardar

JS HTML DOM

Introdução ao DOM Métodos DOM Documento DOM Elementos DOM HTML DOM Formulários DOM CSS DOM Animações DOM Eventos DOM Ouvinte de eventos DOM Navegação DOM Nós DOM Coleções DOM Listas de nós DOM

BOM do navegador JS

Janela JS Tela JS Localização JS Histórico de JS Navegador JS Alerta pop-up JS Temporização JS Cookies JS

APIs da Web JS

Introdução à API da Web API de formulários da Web API de histórico da web API de armazenamento da Web API do trabalhador da Web API de busca da Web API de geolocalização da Web

JS AJAX

Introdução AJAX AJAX XML Http Solicitação AJAX Resposta AJAX Arquivo XML AJAX PHP AJAX ASP AJAX Banco de dados AJAX Aplicativos AJAX Exemplos AJAX

JS JSON

Introdução JSON Sintaxe JSON JSON x XML Tipos de dados JSON Análise JSON JSON Stringify Objetos JSON Matrizes JSON Servidor JSON JSON PHP HTML JSON JSON JSONP

JS x jQuery

Seletores jQuery HTML jQuery jQuery CSS jQuery DOM

Gráficos JS

Gráficos JS Tela JS JS Plotly JS Chart.js JS Google Chart JS D3.js

Exemplos JS

Exemplos JS JS HTML DOM Entrada HTML JS Objetos HTML JS Eventos HTML JS Navegador JS Editor JS Exercícios JS Teste JS Certificado JS

Referências JS

Objetos JavaScript Objetos HTML DOM


Fechamentos de JavaScript


As variáveis ​​JavaScript podem pertencer ao escopo local ou global .

Variáveis ​​globais podem se tornar locais (privadas) com closures .


Variáveis ​​globais

A functionpode acessar todas as variáveis ​​definidas dentro da função, assim:

Exemplo

function myFunction() {
  let a = 4;
  return a * a;
}

Mas a functiontambém pode acessar variáveis ​​definidas fora da função, assim:

Exemplo

let a = 4;
function myFunction() {
  return a * a;
}

No último exemplo, a é uma variável global .

Em uma página da Web, as variáveis ​​globais pertencem ao objeto window.

As variáveis ​​globais podem ser usadas (e alteradas) por todos os scripts na página (e na janela).

No primeiro exemplo, a é uma variável local .

Uma variável local só pode ser usada dentro da função onde está definida. Ele está oculto de outras funções e outros códigos de script.

Variáveis ​​globais e locais com o mesmo nome são variáveis ​​diferentes. Modificar um, não modifica o outro.

Variáveis ​​criadas sem uma palavra-chave de declaração ( var, let, ou const) são sempre globais, mesmo que sejam criadas dentro de uma função.

Exemplo

function myFunction() {
  a = 4;
}


Vida útil variável

As variáveis ​​globais permanecem vivas até que a página seja descartada, como quando você navega para outra página ou fecha a janela.

Variáveis ​​locais têm vida curta. Eles são criados quando a função é invocada e excluídos quando a função é concluída.


Um Contra-Dilema

Suponha que você queira usar uma variável para contar algo e queira que esse contador esteja disponível para todas as funções.

Você pode usar uma variável global e a functionpara aumentar o contador:

Exemplo

// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

// The counter should now be 3

Há um problema com a solução acima: qualquer código na página pode alterar o contador, sem chamar add().

O contador deve ser local para a add()função, para evitar que outro código o altere:

Exemplo

// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

//The counter should now be 3. But it is 0

Não funcionou porque exibimos o contador global em vez do contador local.

Podemos remover o contador global e acessar o contador local deixando a função retorná-lo:

Exemplo

// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
  return counter;
}

// Call add() 3 times
add();
add();
add();

//The counter should now be 3. But it is 1.

Não funcionou porque redefinimos o contador local toda vez que chamamos a função.

 Uma função interna JavaScript pode resolver isso.


Funções aninhadas de JavaScript

Todas as funções têm acesso ao escopo global.  

De fato, em JavaScript, todas as funções têm acesso ao escopo "acima" delas.

JavaScript suporta funções aninhadas. As funções aninhadas têm acesso ao escopo "acima" delas.

Neste exemplo, a função interna plus()tem acesso à countervariável na função pai:

Exemplo

function add() {
  let counter = 0;
  function plus() {counter += 1;}
  plus();   
  return counter;
}

Isso poderia ter resolvido o contra-dilema, se pudéssemos alcançar a plus() função de fora.

Também precisamos encontrar uma maneira de executar counter = 0apenas uma vez.

Precisamos de um encerramento.


Fechamentos de JavaScript

Lembre-se de funções de auto-invocação? O que essa função faz?

Exemplo

const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter}
})();

add();
add();
add();

// the counter is now 3

Exemplo explicado

A variável addé atribuída ao valor de retorno de uma função de auto-invocação.

A função de auto-invocação é executada apenas uma vez. Ele define o contador como zero (0) e retorna uma expressão de função.

Desta forma add se torna uma função. A parte "maravilhosa" é que ele pode acessar o contador no escopo pai.

Isso é chamado de encerramento de JavaScript . Torna possível que uma função tenha variáveis ​​" privadas ".

O contador é protegido pelo escopo da função anônima e só pode ser alterado usando a função add.

Um encerramento é uma função que tem acesso ao escopo pai, mesmo após o fechamento da função pai.