1. Escopo de função
1. Escopo de função
Isso significa que o escopo está em uma "função" e todas as variáveis pertencentes a esta função podem ser usadas e multiplexadas em todo o escopo da função.
function foo (a) {var b = 2; barra de função () {// ...} var c = 3;} bar (); // falhou console.log (a, b, c); // Todos os três falharamSe vários identificadores na função "foo" acima serão relatados se forem colocados fora da função e acessados.
2. Execute a expressão da função imediatamente
Adicionar funções de wrapper fora de qualquer snippet de código pode "ocultar" as variáveis internas e as definições de funções, e o escopo externo não pode acessar nada dentro da função do wrapper.
Por exemplo, a barra acima, A e outros identificadores. Isso protegerá a variável da contaminação.
Ao escrever plug-ins, você costuma usar imediatamente para executar expressões de função para proteger as variáveis dentro.
var a = 2; (function foo () {var a = 3; console.log (a); // 3}) (); console.log (a); // 2O primeiro () em "Foo" transforma a função em uma expressão e o segundo () executa essa função.
Há um termo especial: iife, que representa a expressão de função imediatamente invocada;
1. O uso avançado é chamá -los de função e passar parâmetros em
(função iife (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2}) (janela);2. Um objetivo em mudança é inverter a ordem de execução do código, que é amplamente utilizada nos projetos CMD ou AMD.
(função iife (fábrica) {fábrica (janela);}) (função def (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2});2. Escopo de bloco
O JavaScript não suporta o escopo do bloco.
for (var i = 0; i <10; i ++) {console.log (i);}O "eu" no código acima é equivalente ao seguinte
var i; para (i = 0; i <10; i ++) {console.log (i);}Mas há exceções, "Tente/Catch", o Catch é um escopo de bloco.
tente {undefined (); // executa uma operação ilegal para forçar uma exceção} catch (err) {console.log (err); // pode executar normalmente! } console.log (err); // ReferenceError: err não encontradoO ES6 alterou o status quo e introduziu uma nova palavra -chave Let, que pode vincular variáveis a qualquer escopo (geralmente dentro {..}). Em outras palavras, as variáveis declaradas para deixar implicitamente se deitar no escopo do bloco.
3. Melhoria
O comportamento do escopo da função e do escopo do bloco é o mesmo e pode ser resumido como: qualquer variável declarada dentro de um escopo será anexada a esse escopo.
1) Compilação e execução
Todas as declarações de variáveis e funções serão processadas primeiro antes que qualquer código seja executado. Você pode ver o seguinte exemplo de código.
a = 2; var a; console.log (a); // 2
Este código é equivalente a:
var a; // a declaração de definição é realizada no estágio de compilação A = 2; // A declaração de atribuição será deixada no local para aguardar o console de estágio de execução.log (a);
2) prioridade da função
A função será promovida primeiro e, em seguida, a variável será.
foo (); // 1Var Foo; function foo () {console.log (1);} foo = function () {console.log (2);};A expressão da função var foo, embora antes da declaração de função Foo (), seja uma declaração duplicada (e, portanto, ignorada), porque a declaração da função será promovida antes da variável normal.
E o código acima é equivalente a:
function foo () {console.log (1);} foo (); // 1foo = function () {console.log (2);};4. Fechamento
Os fechamentos referem -se a funções que têm acesso a variáveis em outro escopo de função. A maneira mais comum de criar fechamentos é criar outra função dentro de uma função.
Acessando variáveis locais dessa função através de outra função, o uso de fechamentos pode romper o domínio da cadeia de ação e passar variáveis e métodos dentro da função para o exterior
Recursos de fechamento:
1. As funções são inerentemente aninhadas
2. As funções internas podem se referir aos parâmetros e variáveis externos
3. Parâmetros e variáveis não serão coletados pelo mecanismo de coleta de lixo
1) Definição
Quando uma função pode se lembrar e acessar o escopo, está localizado, um fechamento é gerado, mesmo que a função seja executada fora do escopo atual.
function foo () {var a = 2; barra de função () {console.log (a);} barra de retorno;} var baz = foo (); baz (); // 2 - Esse é o efeito do fechamento.1. Atribua a função "bar" a "baz" e execute "baz". O escopo atual não está no escopo da "barra", mas pode ser executado.
2. O fechamento também impedirá a coleta de lixo. Quando o "foo" é executado, o escopo interno ainda existe. Dessa forma, o "baz" pode ser executado.
2) Passe a função como um parâmetro
function foo () {var a = 2; function baz () {console.log (a); // 2} bar (baz);} barra de função (fn) {fn (); // Este é o fechamento! }Passe o baz da função interna para a barra e, quando essa função interna é chamada (FN), o fechamento do escopo interno de Foo () que ele cobre pode ser observado porque pode acessar a.
Se você tratar uma função como um tipo de valor no primeiro nível e passar por toda parte, verá a aplicação de fechamentos nessas funções.
Em temporizadores, ouvintes de eventos, solicitações de AJAX, comunicação entre janelas, funcionários da web ou quaisquer outras tarefas assíncronas (ou síncronas), desde que a função de retorno de chamada seja usada, ela está realmente usando o fechamento!
3) loops e fechamentos
for (var i = 1; i <= 5; i ++) {setTimeout (timer da função () {console.log (i);}, i * 1000);}Toda vez que for impresso, será 6 e o retorno de chamada da função de atraso será executado apenas no final do loop.
De acordo com como o escopo funciona, a realidade é que, embora as cinco funções no loop sejam definidas separadamente em cada iteração, todas elas estão cercadas em um escopo global compartilhado, então existe apenas um i.
Agora use o fechamento para implementar as diferentes I impressão a cada vez.
for (var i = 1; i <= 5; i ++) {(function (j) {setTimeout (função timer () {console.log (j);}, j * 1000);}) (i);}O IIFE cria escopos declarando e executando uma função imediatamente. O retorno de chamada no setTimeout pode lembrar o escopo atual e o parâmetro "J" em cada escopo é diferente.
O exposto acima é uma explicação detalhada do escopo mais confuso, melhoria e conhecimento de fechamento do JavaScript que o editor apresenta a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!