Para o escopo de variáveis, idiomas como C, Java adotam o método "Block Scope". Por outro lado, o JavaScript adota o método "escopo da função" - o escopo da variável é determinado apenas pela função em que está localizada e não tem nada a ver com blocos lógicos, como se e para. Por exemplo, o exemplo a seguir mostra os comportamentos em JavaScript que são diferentes dos idiomas como C e Java:
A cópia do código é a seguinte:
função(){
var s = 42; // s é visível em toda a função
if (s> 3) {
var x = "teste"; // x é visível em toda a função
for (var i = 0; i <10; i ++) {
console.log (i);
}
console.log (i); // i é visível em toda a função
}
console.log (i);
console.log (x);
}
Em idiomas "Block Scope", como C e Java, após blocos lógicos, como se as instruções e para declarações sejam concluídas, variáveis definidas dentro desses blocos lógicas serão destruídas. JavaScript é diferente. Enquanto uma variável for definida em uma função, todos os códigos em toda a função podem acessar a variável, mesmo que os códigos estejam antes da definição da variável:
A cópia do código é a seguinte:
função(){
console.log (a); // indefinido
var a = "teste";
console.log (a); // teste
}
No exemplo acima, se A nunca for definido em função, o console.log (a) lançará um referenceError. Quando A é definido em função, mesmo que essa definição seja após a declaração de chamada A variável, a chamada para A é uma operação legal (se a definição de uma variável ocorrer após a declaração de chamada, o valor de uma variável na declaração de chamada é indefinido). De fato, todas as variáveis definidas com a palavra -chave VAR na função serão aumentadas para o início da função (a operação de atribuição permanece na linha definida pelo VAR), que é chamada de iça no JavaScript. Por exemplo, o código acima é equivalente a:
A cópia do código é a seguinte:
função(){
var a;
console.log (a); // indefinido
a = "teste";
console.log (a); // teste
}
Cadeia de variáveis de escopo
Entrar em contato com o armazenamento de variáveis no JavaScript pode fornecer um bom entendimento do "escopo da função" e a iça no JS. Como as variáveis são armazenadas em objetos globais ou objetos de chamada de função, ao definir uma variável em uma função, não importa onde a variável seja definida na chamada de função, uma propriedade com o mesmo nome que essa variável aparecerá inevitavelmente no objeto de chamada de função usado por esta chamada de função. Isso permite que a variável seja acessada em qualquer lugar da função.
Quando se trata de chamadas de função, há outro conceito mais interessante em JavaScript: a cadeia de variáveis do escopo - como as variáveis são armazenadas em objetos globais ou objetos de chamada de função, ao acessar variáveis, você pode obter valores de vários objetos. O código a seguir é um exemplo:
A cópia do código é a seguinte:
var x = "teste";
função(){
// Função de nível 1
var x = "temp";
função(){
// Função de nível 2
var x = "real";
// Tente acessar x aqui. X será "real".
}
}
Dentro da função de nível 2 no código acima, ao tentar acessar a variável x, o programa pode procurar os valores de atributo correspondentes de 3 objetos: o objeto de chamada de função usado para chamar a função de nível 2, o objeto de chamada de função usado para chamar a função de nível 1 e o objeto global - de acordo com o objeto global definido pela função, a função, a função, a função gerará uma cadeia de objeto composta de o objeto global e a função da função. Ao acessar variáveis, o programa começará a pesquisar no objeto mais próximo da instrução Access. Se nenhuma pesquisa for encontrada, continuará pesquisando no objeto no nível anterior na cadeia de objetos até o objeto global.
Como essa cadeia de objetos está relacionada ao escopo da variável, ela também é chamada de "cadeia de escopo".
Se você precisar alterar temporariamente a cadeia de escopo e inserir um objeto na extremidade frontal da cadeia de escopo (como o objeto de função que é acessado primeiro), você pode usar a instrução with:
A cópia do código é a seguinte:
com (o) {
// Código Use propriedades do objeto o.
}
No entanto, no modo rigoroso JavaScript, com declarações são desativadas; Mesmo no modo não rigoroso, com declarações não são recomendadas.