Este artigo descreve as técnicas de pré-paralismo e relacionamentos de JavaScript. Compartilhe -o para sua referência, como segue:
variável
Novamente, comece com as solicitações de comparação de erros desses dois pequenos exemplos.
alerta (y1); // segmento de código 1Var y1 = 'dddd'; alerta (y2); // segmento de código 2 // alerta (tipo de y2); y2 = 'xxxxx';
Vamos primeiro pensar sobre por que um solicita indefinido e o outro lança o erro de variáveis indefinidas. . Vamos primeiro olhar para o processo de análise JavaScript.
Antes do processo de execução, o JavaScript fará um evento "Preparement". O mecanismo de análise executa a criação de todas as variáveis VAR no nível do bloco e fornece um valor inicial: indefinido. Dessa forma, a razão pela qual o primeiro exemplo aparece indefinido é óbvio.
Portanto, o primeiro código é realmente equivalente a
var y1; alerta (tipo de y1); // naturalmente, seu valor é indefinido1 = 'dddd';
Por que a segunda peça de código jogou o errado novamente? Não pertence mais ao estágio "pré-parse" (aqui presumo que o navegador faz apenas duas coisas ao encontrar uma etiqueta de script: pré-parse e execução, que na verdade não são apenas essas duas coisas). No entanto, no estágio de execução, o motivo para lançar o erro é que o JS não conhece o estado de Y2 no estado do segmento de execução (nenhuma informação de Y2 foi capturada no estágio de pré-parto) e, é claro, ele lançou informações de erro indefinidas. Outro problema está envolvido aqui: o JS é um idioma do tipo fraco, e as variáveis podem ser usadas sem definição, então por que ela é lançada aqui como um erro de definição?
Sempre há uma razão para que as coisas aconteçam. O JavaScript sempre tem muitos recursos estranhos, e há uma variável que é lida e escrita irregular. Variáveis indefinidas são apenas graváveis e não legíveis. O que pode ser escrito? Todo mundo está familiarizado com este método de escrita:
y2 = 'Exame'; // Antes de sua operação de definição aparecer (ou seja, antes de não ter seu próprio escopo), esta operação considerará este código para definir uma variável global, registrar uma propriedade Y2 na janela e atribui -la ao exame
Mas, ao lê -lo, o mecanismo JS não pode encontrar nenhuma informação relacionada, por isso age com seu próprio temperamento e comete um erro indefinido sem hesitar. Esta é a regra do jogo de JS. E, no entanto, por que você pode obter seu tipo? Lembre -se de operações da JS em objetos. Se você acessar um objeto que não existe, ele solicitará indefinido (porque atualmente é um atributo do objeto da janela).
NOTA: É necessário distinguir aqui que as variáveis de leitura e gravação são usadas apenas para variáveis e todas as propriedades dos objetos são lidas. Esse recurso não existe. Se não existir, será indefinido.
para concluir
Neste ponto, meus pensamentos resultam: existem certas semelhanças nas operações de escrita de variáveis e objetos. No entanto, cada um tem seu próprio conjunto de regras para a leitura de operações. Por causa disso, os problemas acima são encontrados.
Dessa maneira, a seguinte pergunta deve ser facilmente respondida.
if (! ('a' na janela)) {var a = 1;} alert (a);função
Para estendê -lo, funcione. Lembre-se do pré-parto mencionado acima. No pré-parto do JavaScript, além da pré-definição das variáveis VAR, também inclui extrair a definição da função, para que a função possa ser definida em qualquer lugar do script e chamada em qualquer lugar. Não limitado a antes.
No entanto, o método de função de definição inclui um método de definição literal, usando o método de var para declarar a função. Veja abaixo
alerta (tipo de y3); // resultado? Var y3 = function () {console.log ('1'); }Lembre -se deste Contrato: a chamada deve aparecer após a declaração. Por que? Se você entende o exposto, a resposta aqui é realmente clara. Ao pré-pular VAR, o mecanismo JavaScript lhes dará um valor inicial indefinido. Dessa forma, se chamarmos antes de sua declaração, o mecanismo JavaScript ainda não obteve seu valor verdadeiro, ele relatará naturalmente o erro de "XXX não é uma função". Isso também esclarece por que ambas as declarações da função estão relacionadas à ordem de declarações e chamadas, e a outra não tem essas restrições.
para concluir
É uma função, o resultado da execução do JS e da modificação dinâmica, e ainda segue as regras de pré-análise das variáveis (ao alertar acima, não obteve as informações da função literal).
E se for uma mistura de dois. Veja o seguinte, existem variáveis e funções para Y4.
alerta (tipo de y4); // resultado? Function y4 () {console.log ('y4')} var y4;Como o JavaScript possui alta prioridade no pré-parto, o Y4 é naturalmente um tipo de função, mas depois que o Y4 é atribuído (o mecanismo JS está no processo de execução), sua operação de atribuição ao JS substituirá a declaração da função. então:
alerta (tipo de y5); var y5 = 'ângulo'; função y5 () {console.log ('fantasma'); } alerta (y5);O primeiro resultado de alerta é a função porque está na parte superior do processo de execução do JS. Na segunda vez em que o Alert é renomeado, seu valor foi reescrito para 5 (não se confunda com a posição de definição da função abaixo.)
Pensando na análise e execução do JS, percebi que de repente percebi que as respostas para muitas perguntas surgiram naturalmente. Como o autor desse artigo dizia: "Depois de entender os conceitos de ambiente de execução, chama objetos, fechamentos, escopo lexical e cadeias de escopo, muitos fenômenos na linguagem JS podem ser resolvidos facilmente".
Olhando para trás agora, mesmo nesta linguagem incrível, há muitas razões que podem ser rastreadas nele.
Como fazer melhores julgamentos de parâmetros
Depois de discutir tanto acima, como isso pode estar mais próximo do desenvolvimento real? Como a lê e a escrita da JavaScript, como podemos evitar fazer julgamentos de parâmetros sem relatar erros?
por exemplo:
if (cusvar) {// O julgamento aqui é um problema implícito. }Como ser mais rigoroso.
if (window ['cusvar']) {// Verifique se ele não relata um erro. // ou tal julgamento também é viável janela.cusvar | typeof cusvar! == 'indefinido' // trabalho}Finalmente, outro pequeno questionário é adicionado (entenda a separação de pré-parto e execução)
var y7 = 'teste'; function fun1 () {alert (y7); var y7 = 'sexo';} fun1 ();For more information about JavaScript related content, please check out the topics of this site: "Summary of JavaScript switching effects and techniques", "Summary of JavaScript search algorithm skills", "Summary of JavaScript animation effects and techniques", "Summary of JavaScript errors and debugging techniques", "Summary of JavaScript data structures and algorithm skills", "Summary of Javascript Algoritmos e Técnicas de Traversal "e" Resumo do Uso do Javascript Mathematic Operations "
Espero que este artigo seja útil para a programação JavaScript de todos.