Les accolades ont quatre fonctions sémantiques en JS
Sémantique 1, organiser les phrases composées, c'est la plus courante
Copiez le code comme suit :
si (condition) {
//...
}autre {
//...
}
pour() {
//...
}
Sémantique 2, déclaration littérale d'objet
Copiez le code comme suit :
var obj = {
nom : 'jack',
âge: 23
} ;
Le tout est une instruction d'affectation, dans laquelle {name:'jack',age:23} est une expression.
Sémantique 3, déclarer une fonction ou une fonction littérale
Copiez le code comme suit :
fonction f1(){
//...
}
var f2 = fonction(){
//...
}
La différence entre f1 et non-f2 est que le premier est dans la période d'interprétation de la syntaxe et le second est dans le temps d'exécution. La différence est la suivante : si le code qui appelle la fonction est après la définition de la fonction, il n'y a aucune différence ; si le code qui appelle la fonction est avant la définition de la fonction, f1 peut toujours être appelé, mais f2 signalera une erreur, indiquant que f2 n'est pas défini.
Sémantique 4, notation syntaxique pour la gestion structurée des exceptions
Copiez le code comme suit :
essayer {
//...
}attraper(ex){
//...
}enfin{
//...
}
Il y a une différence entre les accolades ici et l'instruction correspondante (sémantique 1) S'il n'y a qu'une seule instruction dans les accolades, les accolades peuvent être omises dans if/else/for, etc., mais try/catch/finally ne peut pas l'être. omis.
J'ai du mal avec le code suivant depuis longtemps
Copiez le code comme suit :
function(){}() //La fonction anonyme est exécutée immédiatement, rapport périodique d'analyse syntaxique
{}.constructor //Obtenez le constructeur du littéral d'objet, et une erreur sera signalée lors de l'analyse syntaxique
Ce qui est curieux, c'est pourquoi [].constructor est écrit ainsi mais ne signale pas d'erreur. L'un est un constructeur qui veut obtenir la valeur directe de l'objet, et l'autre est simplement un constructeur qui veut obtenir la valeur directe de l'objet. le tableau.
Bien entendu, l’ajout d’une variable à recevoir ne provoquera pas d’erreur.
var c = {}.constructeur ;
La même situation est comme
var fn = function(){}() ne signalera pas d'erreur.
En fait, c'est la "priorité de l'instruction" de js qui pose problème, c'est-à-dire que {} est compris comme un bloc d'instructions composé (sémantique 1) plutôt que comme la sémantique d'un objet littéral (sémantique 2) ou d'une fonction déclarée ( sémantique 3).
function(){}(), les accolades sont comprises comme des instructions composées. Naturellement, la syntaxe de la fonction de déclaration function() précédente est incomplète, provoquant une erreur lors de l'analyse syntaxique.
{}.constructor, les accolades sont comprises comme des instructions composées, et les accolades sont suivies de l'opérateur point. S'il n'y a pas d'objet raisonnable avant l'opérateur point, une erreur sera naturellement signalée.
Le correctif est bien connu : ajouter un opérateur de coercition()
(function(){})(), (function(){});//Force à être compris comme une fonction (sémantique 3), "function()" signifie exécuter la fonction, c'est-à-dire qu'elle est exécutée immédiatement après déclaration.
({}).constructor //({}) force les accolades à être comprises comme des littéraux d'objet (sémantique 2) signifie obtenir les membres de l'objet. Naturellement, l'opérateur point suivant peut être exécuté normalement. .