Veja o seguinte código:
A cópia do código é a seguinte:
if (! ("aa" na janela)) {
alerta ('Oh meu Deus');
var aa = 1;
}
alerta ("aa" na janela);
alerta (AA);
Responda às seguintes perguntas:
Um erro será relatado? Quantas vezes ele aparecerá?
O segundo alerta é verdadeiro ou falso?
O que aparece no terceiro alerta?
Por que?
Pense nisso e depois teste. Se você responder corretamente, não precisará ler os seguintes artigos.
-----------------------------
Definir variáveis em JS é muito simples. Você pode apenas usar um VAR, ou mesmo sem VAR:
A cópia do código é a seguinte:
var a = 1;
Aqui A é o nome da variável e 1 é o valor variável. Infelizmente, isso é muito básico. Veja o seguinte código:
A cópia do código é a seguinte:
var a;
alerta (a);
No teste do Firebug, indefinido aparecerá. Esta é uma string muito familiar, que parece indicar que a variável é indefinida. Mas acho que já o variando, esta é a definição, mas não há valor anexado.
Vamos fazer algo que é realmente indefinido:
A cópia do código é a seguinte:
alerta (a);
É isso mesmo, apenas alerta uma variável que nunca apareceu. O que vai acontecer?
O Firebug relatou diretamente um erro: a não está definido. Isso significa que A não está definido. Combinando o código anterior, isso é confuso. Qual é a diferença entre esse indefinido e o anterior indefinido?
De fato, o código anterior é equivalente a isso:
A cópia do código é a seguinte:
var a = indefinido;
alerta (a);
Em outras palavras, quando uma variável é declarada sem atribuir um valor, o JS passa um valor indefinido para a variável. Observe que este é um "valor", o que significa que um já tem um valor, e esse valor é chamado de "indefinido".
As variáveis por trás do alerta direto nunca apareceram, o que significa que este é o verdadeiro indefinido.
Simplificando: não há variável sem um valor em JS e o valor é atribuído quando a variável é declarada.
Então olhamos para o seguinte código:
A cópia do código é a seguinte:
alerta (a);
var a = 1;
Este código relatará um erro? Porque quando o alerta está alerta, a variável A ainda não apareceu.
Mas não há erro dessa maneira, mas um valor indefinido aparece. Indica que a variável A já existe, mas o valor não é o que queremos, mas é indefinido. Qual é o problema?
Como a declaração variável VAR é a mesma que a declaração de função, será avançada, de fato, o código acima se parece com o seguinte:
A cópia do código é a seguinte:
var a;
alerta (a);
a = 1;
Dessa forma, você vai entender.
Portanto, a chave para esse problema é: a declaração VAR chegará ao topo do escopo com antecedência, mas o valor anexado não será - uma configuração muito emaranhada, não sei por que fiz isso. Pessoalmente, acho que isso é uma falha de JS.
Agora existe um hábito de código que defende a colocação de declarações variáveis na frente do escopo, provavelmente considerando isso - mesmo que você não as escreva na frente, o JS irá adiante com antecedência.
Agora, deixe -me lançar a resposta para a pergunta no início do artigo:
Apenas dois alertas aparecerão e o alerta se não for executado, porque a declaração VAR é avançada, o código real se parece com o seguinte:
A cópia do código é a seguinte:
var aa;
if (! ("aa" na janela)) {
alerta ('Oh meu Deus');
aa = 1;
}
alerta ("aa" na janela);
alerta (AA);
Embora o AA esteja vazio, será verdade quando julgado por 'AA' na janela, porque a existe e o valor é indefinido. Portanto, se o código não for executado. Não vou falar sobre os dois últimos alertas.
Pessoalmente, sinto que essa é uma pergunta muito absurda. Devemos entender suas razões, mas o desprezam como uma armadilha.
A pergunta acima também é a razão pela qual escrevi este artigo. Eu vi esse código de um artigo on -line, mas não há resposta nele. Eu não conseguia espancar minha irmã, então fui ao Stackoverflow e pedi para descobrir. A resposta é este artigo.
Mas essa é uma pergunta muito básica, na verdade! ! !
Haha, me perdoe, há outra pergunta:
A cópia do código é a seguinte:
var b = {}
Alerta (B.Aa);
alerta (B.AA.BB);
Esta também é uma maneira de declarar variáveis. Então, esse código relatará um erro? Por que?