Chaves têm quatro funções semânticas em JS
Semântica 1, organize frases compostas, esta é a mais comum
Copie o código do código da seguinte forma:
se(condição) {
//...
}outro {
//...
}
para() {
//...
}
Semântica 2, declaração literal de objeto
Copie o código do código da seguinte forma:
varobj = {
nome: 'Jack',
idade: 23
};
A coisa toda é uma instrução de atribuição, na qual {name:'jack',age:23} é uma expressão.
Semântica 3, declarar função ou função literal
Copie o código do código da seguinte forma:
função f1(){
//...
}
var f2 = função(){
//...
}
A diferença entre f1 e não-f2 é que o primeiro está no período de interpretação da sintaxe e o segundo está no tempo de execução. A diferença é: se o código que chama a função for posterior à definição da função, não há diferença se o código que chama a função for anterior à definição da função, f1 ainda poderá ser chamado, mas f2 reportará um erro, avisando que; f2 não está definido.
Semântica 4, notação sintática para tratamento estruturado de exceções
Copie o código do código da seguinte forma:
tentar {
//...
}pegar(ex){
//...
}finalmente{
//...
}
Há uma diferença entre os colchetes aqui e a instrução correspondente (semântica 1). Se houver apenas uma instrução entre colchetes, os colchetes podem ser omitidos em if/else/for, etc., mas try/catch/finalmente não pode ser. omitido.
Eu tenho lutado com o código a seguir há muito tempo
Copie o código do código da seguinte forma:
function(){}() //Função anônima é executada imediatamente, relatório periódico de análise de sintaxe
{}.constructor //Obtém o construtor do objeto literal e um erro será relatado durante a análise de sintaxe
O que é intrigante é por que [].constructor é escrito assim, mas não relata um erro. Um é um construtor que deseja obter o valor direto do objeto e o outro é apenas um construtor que deseja obter o valor direto de. a matriz.
É claro que adicionar uma variável para receber não causará erro.
var c = {}.construtor;
A mesma situação é como
var fn = function(){}() não reportará um erro.
Na verdade, é a "prioridade de instrução" de js que está causando problemas, ou seja, {} é entendido como um bloco de instrução composto (semântica 1) em vez da semântica de um objeto literal (semântica 2) ou de uma função declarada ( semântico 3).
function(){}(), chaves são entendidas como instruções compostas. Naturalmente, a sintaxe da função de declaração function() anterior está incompleta, causando um erro durante a análise de sintaxe.
{}.construtor, as chaves são entendidas como instruções compostas e as chaves são seguidas pelo operador ponto. Se não houver nenhum objeto razoável antes do operador ponto, um erro será naturalmente relatado.
A correção é bem conhecida: adicione um operador de coerção ()
(function(){})(), (function(){});//Força que seja entendida como uma função (semântica 3), "function()" significa executar a função, ou seja, ela é executada imediatamente após declaração.
({}).constructor //({}) força as chaves a serem entendidas como literais de objeto (semântica 2) significa obter os membros do objeto. Naturalmente, o operador de ponto subsequente pode ser executado normalmente. .