Las llaves tienen cuatro funciones semánticas en JS
Semántica 1, organizar oraciones compuestas, esta es la más común
Copie el código de código de la siguiente manera:
si (condición) {
//...
}demás {
//...
}
para() {
//...
}
Semántica 2, declaración literal de objeto
Copie el código de código de la siguiente manera:
var objeto = {
nombre: 'gato',
edad: 23
};
Todo es una declaración de asignación, en la que {nombre:'jack',edad:23} es una expresión.
Semántica 3, declarar función o función literal
Copie el código de código de la siguiente manera:
función f1(){
//...
}
var f2 = función(){
//...
}
La diferencia entre f1 y no f2 es que el primero está en el período de interpretación de sintaxis y el segundo en el tiempo de ejecución. La diferencia es: si el código que llama a la función está después de la definición de la función, no hay diferencia si el código que llama a la función está antes de la definición de la función, aún se puede llamar a f1, pero f2 informará un error, indicando eso; f2 no está definido.
Semántica 4, notación de sintaxis para manejo estructurado de excepciones
Copie el código de código de la siguiente manera:
intentar {
//...
}captura(ex){
//...
}finalmente{
//...
}
Hay una diferencia entre las llaves aquí y la declaración coincidente (semántica 1). Si solo hay una declaración entre las llaves, las llaves se pueden omitir en if/else/for, etc., pero try/catch/finally no se puede. omitido.
He estado luchando con el siguiente código durante mucho tiempo.
Copie el código de código de la siguiente manera:
function(){}() // La función anónima se ejecuta inmediatamente, informe periódico de análisis de sintaxis
{}.constructor // Obtenga el constructor del objeto literal y se informará un error durante el análisis de sintaxis
Lo que es desconcertante es por qué [].constructor está escrito así pero no informa un error. Uno es un constructor que quiere obtener el valor directo del objeto y el otro es solo un constructor que quiere obtener el valor directo de. la matriz.
Por supuesto, agregar una variable para recibir no causará ningún error.
var c = {}.constructor;
La misma situación es como
var fn = function(){}() no informará un error.
De hecho, es la "prioridad de declaración" de js la que está causando problemas, es decir, {} se entiende como un bloque de declaración compuesto (semántica 1) en lugar de la semántica de un objeto literal (semántica 2) o una función declarada ( semántico 3).
function(){}(), las llaves se entienden como declaraciones compuestas. Naturalmente, la sintaxis de la función de declaración de function() anterior está incompleta, lo que provoca un error durante el análisis de sintaxis.
{}.constructor, las llaves se entienden como declaraciones compuestas, y las llaves van seguidas del operador de punto. Si no hay un objeto razonable antes del operador de punto, naturalmente se informará un error.
La solución es bien conocida: agregar un operador de coerción ()
(function(){})(), (function(){});// Forzar que se entienda como una función (semántica 3), "función ()" significa ejecutar la función, es decir, se ejecuta inmediatamente después de la declaración.
({}).constructor //({}) obliga a que las llaves se entiendan como objetos literales (semántica 2). "Object.xx" significa obtener los miembros del objeto. Naturalmente, el operador de punto posterior se puede ejecutar normalmente. .