Em cada linguagem de programação, suas variáveis têm um certo intervalo válido. Depois de exceder esse intervalo, as variáveis se tornarão inválidas. Este é o escopo da variável. Do ponto de vista matemático, é o domínio de variáveis independentes.
O escopo é a faixa acessível de variáveis, ou seja, o escopo controla a visibilidade e o ciclo de vida de variáveis e funções. No JavaScript, objetos e funções também são variáveis e as variáveis são definidas dentro do corpo da função arbitrária aninhadas pela declaração de seu corpo de função e pelo corpo da função arbitrária aninhado.
1. Escopo estático e escopo dinâmico
Escopo estático
Isso significa que o escopo da declaração é determinado no tempo de compilação com base no corpo do programa, também conhecido como escopo lexical. A maioria das linguagens de programação moderna adota regras estáticas do escopo, e o JavaScript adota esse escopo.
Em idiomas que usam escopos estáticos, as regras de escopo aninhadas mais internas são basicamente: o identificador introduzido por uma declaração é visível no escopo em que a declaração está localizada e também em cada escopo aninhado dentro, a menos que seja coberto por outra declaração do mesmo nome identificador aninhado dentro.
Para encontrar o objeto referenciado por um determinado identificador, ele deve ser encontrado no escopo atual. Se uma declaração for encontrada, o objeto referenciado pelo identificador poderá ser encontrado. Caso contrário, procuraremos no escopo externo direto e continuaremos a verificar o escopo externo para o exterior até chegarmos ao nível mais externo de nidificação do programa, ou seja, o escopo em que a declaração de objeto global está localizada. Se nenhuma declaração for encontrada em todos os níveis, o programa terá um erro. do seguinte modo:
função cha () {var name = "xiao;" function chb () {function chc () {console.log (nome); }}}Primeiro, a função procura a definição de nome do chb () e continua a pesquisar camada por camada por camada. Finalmente, a definição de nome é encontrada em Cha (). Se não for encontrado, um erro será relatado.
2. Escopo dinâmico
Em um idioma com escopo dinamicamente, o objeto referenciado por uma variável no programa é determinado com base nas informações de fluxo de controle do programa no momento da execução do programa.
2. O escopo do JavaScript
Existem dois escopos em JavaScript, a saber, o escopo global e o escopo local.
1. Escopo global
Há uma definição em qualquer lugar do código. Mesmo que uma variável global seja definida em uma parte do código JS aninhado na página HTML, a variável ainda pode ser acessada no arquivo JS referenciado. É muito provável que isso cause poluição às variáveis globais.
As variáveis nos três casos a seguir serão consideradas variáveis globais
(1) A função mais externa e a variável mais externa têm um escopo global
(2) As variáveis que são atribuídas diretamente sem definição são declaradas automaticamente como tendo escopo global
(3) As propriedades de todos os objetos de janela têm escopo global
2. Escopo local
Os escopos locais geralmente podem ser acessados apenas em trechos de código fixo, como variáveis dentro das funções (escopo da função)
var name = "xuxiaoping"; function echoname () {var FirstName = "xu"; // escopo local SecondName = "xiao"; // função de escopo global ecofirstname () {console.log (primeiro nome); // xu} console.log (SecondName); return eChofirstName;} console.log (nome); // escopo global var f = echoname (); f (); console.log (primeironame); console.log (segundoname);O resultado é:
Xuxiaoping
Xiao
Xu // Função interna pode acessar variáveis da função externa
indenizado // as variáveis internas da função não podem ser acessadas fora da função
Xiao
O JavaScript anexa variáveis globais a objetos de janela e se torna uma propriedade de objetos de janela.
3. Escopo de função
Escopo no nível do bloco: qualquer conjunto de declarações no aparelho pertence a um bloco, e todas as variáveis definidas nisso são invisíveis fora do bloco de código. A maioria dos idiomas da classe C possui escopos de nível em bloco.
No entanto, uma característica importante do JavaScript é que ele não possui escopo em nível de bloco.
função echoi () {for (var i = 0; i <10; i ++) {; // console.log (i); } if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();O resultado da saída é:
10
olá
Pode -se observar que fora da instrução for (ou se, enquanto), a variável que eu defini no bloco ainda está acessível. Ou seja, o JavaScript não suporta escopos no nível do bloco, ele suporta apenas escopos de função e as variáveis definidas em qualquer lugar de uma função são visíveis em qualquer lugar nessa função. Como alguém que aprende C e Java desde o início, isso é um pouco difícil de se adaptar. De acordo com meus testes, o mesmo se aplica ao PHP.
Obviamente, você pode usar as características de fechamento do JavaScript para simular o escopo no nível do bloco
função echoi () {(function () {for (var i = 0; i <10; i ++) {; // console.log (i);}}) (); if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();O resultado é: eu indefinido
Isso isola a definição de variáveis. No JS, para evitar conflitos de nomeação, variáveis globais e funções globais devem ser evitadas o máximo possível, portanto esse tipo de fechamento é usado de várias maneiras.
4. Ciclo de vida variável JavaScript
O ciclo de vida variável JavaScript é inicializado quando é declarado.
As variáveis locais são destruídas após a execução da função.
As variáveis globais são destruídas após o fechamento da página.
3. Cadeia de escopo JavaScript
Parece uma corrente, provavelmente pode ser combinada com a lista vinculada na estrutura de dados.
No JavaScript, as funções são objetos, mas, de fato, tudo no JavaScript é objetos. Objetos de função, como outros objetos, possuem propriedades que podem ser acessadas através do código e uma série de propriedades internas que são acessíveis apenas ao mecanismo JavaScript. Uma das propriedades internas é [[escopo]], definido pela terceira edição do padrão ECMA-262. Essas propriedades internas contêm uma coleção de objetos no escopo criado pela função. Esta coleção é chamada de cadeia de funções do escopo, que determina quais dados podem ser acessados por funções.
Quando uma função é criada, sua cadeia de escopo é preenchida com objetos de dados acessíveis no escopo da função. Por exemplo, defina uma função como esta:
função add (num1, num2) {var sum = num1 + num2; soma de retorno;}Quando a adição de função é criada, um objeto global será preenchido em sua cadeia de escopo, que contém todas as variáveis globais, como mostrado na figura abaixo (Nota: A imagem fornece apenas algumas de todas as variáveis):
O escopo da função adiciona será usado durante a execução. Por exemplo, execute o seguinte código:
var total = add (5,10);
Ao executar essa função, um objeto interno chamado "contexto de execução" é criado. O contexto de tempo de execução define o ambiente em que a função é executada. Cada contexto de tempo de execução tem sua própria cadeia de escopo para análise de identificador. Quando o contexto de tempo de execução é criado, sua cadeia de escopo é inicializada como um objeto contido em [[escopo]] da função atual em execução.
Esses valores são copiados na cadeia de escopo do contexto de tempo de execução na ordem em que aparecem na função. Juntos, eles formam um novo objeto chamado "objeto de ativação", que contém todas as variáveis locais, denominadas parâmetros, conjuntos de parâmetros e essa função. Em seguida, esse objeto será empurrado para a extremidade frontal da corrente do escopo. Quando o contexto em execução for destruído, o objeto ativo será destruído. A nova cadeia de escopo é mostrada na figura abaixo:
Durante a execução da função, toda vez que uma variável é encontrada, um processo de análise de identificador será passado para decidir onde obter e armazenar dados. Esse processo começa com a cabeça da cadeia de escopo, ou seja, procura um identificador com o mesmo nome do objeto ativo. Se for encontrado, use a variável correspondente a esse identificador. Se não for encontrado, continue pesquisando o próximo objeto na cadeia de escopo. Se todos os objetos não forem encontrados após a pesquisa, o identificador será considerado indefinido. Durante a execução da função, cada identificador deve passar por esse processo de pesquisa.
4. Otimização de cadeia de escopo e código
A partir da estrutura da cadeia do escopo, pode -se observar que, na cadeia de escopo do contexto de tempo de execução, quanto mais profundo o identificador for, mais lenta será a velocidade de leitura e gravação. Como mostrado na figura acima, como as variáveis globais sempre existem no final da cadeia de escopo de contexto durante o tempo de execução, é o mais lento encontrar variáveis globais ao analisar o identificador. Portanto, ao escrever código, você deve tentar usar variáveis globais o mínimo possível e usar variáveis locais o máximo possível. Uma boa regra geral é: se um objeto de escopo cruzado for referenciado mais de uma vez, guarde-o em uma variável local antes do uso. Por exemplo, o seguinte código:
function chanGecolor () {document.getElementById ("btnchange"). OnClick = function () {document.getElementById ("TargetCanvas"). style.backgroundColor = "Red"; };}Esta função refere -se ao documento da variável global duas vezes. A variável deve ser pesquisada em toda a cadeia de escopo até que seja finalmente encontrada no objeto global. Este código pode ser reescrito da seguinte maneira:
function chanGecolor () {var doc = document; doc.getElementById ("btnChange"). OnClick = function () {doc.getElementById ("TargetCanvas"). style.backgroundColor = "Red"; };}Esse código é relativamente simples e não mostrará uma enorme melhoria de desempenho após a reescrita, mas se um grande número de variáveis globais no programa for acessado repetidamente, o desempenho do código após a reescrita será significativamente melhorado.
5. Com a cadeia de escopo de mudança
O contexto de tempo de execução correspondente é único sempre que o número é executado; portanto, chamar a mesma função várias vezes levará à criação de vários contextos de tempo de execução. Quando a função é executada, o contexto de execução será destruído. Cada contexto de tempo de execução está associado a uma cadeia de escopo. De um modo geral, durante o contexto em execução, sua cadeia de escopo só será afetada pela declaração com a declaração e pela captura.
A instrução com com a maneira rápida de aplicar objetos para evitar a gravação de código duplicado. Por exemplo:
function initui () {com (document) {var bd = body, links = getElementsByTagName ("a"), i = 0, len = links.length; while (i <len) {update (links [i ++]); } getElementById ("btninit"). OnClick = function () {Dosomething (); }; }}Use declarações de largura aqui para evitar escrever o documento várias vezes, que parece mais eficiente, mas na verdade cria problemas de desempenho.
Quando o código é executado para a instrução com com o escopo do contexto de tempo de execução é alterado temporariamente. Um novo objeto mutável é criado, que contém todas as propriedades do objeto especificado pelo parâmetro. Esse objeto será empurrado para a cabeça da cadeia de escopo, o que significa que todas as variáveis locais da função estão agora no objeto de cadeia do segundo escopo, portanto o acesso é mais caro. Como mostrado na figura abaixo:
Portanto, com declarações deve ser evitado em programas. Neste exemplo, simplesmente armazenar o documento em uma variável local pode melhorar o desempenho.
Resumir
1. O escopo de uma variável é onde o escopo da variável é válido.
2. A cadeia de variáveis do escopo é a coleta de objetos no escopo criado.
O exposto acima é tudo sobre este artigo, espero que seja útil para todos aprenderem a programação de JavaScript.