Klammern haben in JS vier semantische Funktionen
Semantik 1: Zusammengesetzte Sätze organisieren, dies ist am häufigsten
Kopieren Sie den Codecode wie folgt:
if(Bedingung) {
//......
}anders {
//......
}
für() {
//......
}
Semantik 2, Objektliteraldeklaration
Kopieren Sie den Codecode wie folgt:
var obj = {
Name: 'Jack',
Alter: 23
};
Das Ganze ist eine Zuweisungsanweisung, in der {name:'jack',age:23} ein Ausdruck ist.
Semantik 3: Funktion oder Funktionsliteral deklarieren
Kopieren Sie den Codecode wie folgt:
Funktion f1(){
//......
}
var f2 = function(){
//......
}
Der Unterschied zwischen f1 und nicht-f2 besteht darin, dass sich ersteres in der Syntaxinterpretationsperiode und letzteres in der Laufzeit befindet. Der Unterschied besteht darin: Wenn der Code, der die Funktion aufruft, nach der Funktionsdefinition steht, gibt es keinen Unterschied; wenn der Code, der die Funktion aufruft, vor der Funktionsdefinition steht, kann f1 immer noch aufgerufen werden, aber f2 meldet einen Fehler, was dazu führt f2 ist nicht definiert.
Semantik 4, Syntaxnotation für strukturierte Ausnahmebehandlung
Kopieren Sie den Codecode wie folgt:
versuchen {
//......
}catch(ex){
//......
}Endlich{
//......
}
Es gibt hier einen Unterschied zwischen den geschweiften Klammern und der passenden Anweisung (Semantik 1). Wenn in den geschweiften Klammern nur eine Anweisung steht, können die geschweiften Klammern in if/else/for usw. weggelassen werden, try/catch/finally jedoch nicht weggelassen.
Ich habe lange Zeit mit dem folgenden Code zu kämpfen
Kopieren Sie den Codecode wie folgt:
function(){}() //Anonyme Funktion wird sofort ausgeführt, regelmäßiger Bericht zur Syntaxanalyse
{}.constructor // Rufen Sie den Konstruktor des Objektliterals ab. Bei der Syntaxanalyse wird ein Fehler gemeldet
Rätselhaft ist, warum [].constructor so geschrieben ist, aber keinen Fehler meldet. Der eine ist ein Konstruktor, der den direkten Wert des Objekts erhalten möchte, und der andere ist nur ein Konstruktor, der den direkten Wert von erhalten möchte das Array.
Das Hinzufügen einer Variablen zum Empfangen führt natürlich nicht zu einem Fehler.
var c = {}.constructor;
Die gleiche Situation ist wie
var fn = function(){}() meldet keinen Fehler.
Tatsächlich ist es die „Anweisungspriorität“ von js, die Probleme verursacht, das heißt, {} wird als zusammengesetzter Anweisungsblock (Semantik 1) und nicht als Semantik eines Objektliterals (Semantik 2) oder einer deklarierten Funktion verstanden ( semantisch 3).
function(){}(), geschweifte Klammern werden als zusammengesetzte Anweisungen verstanden. Natürlich ist die Syntax der vorherigen function()-Deklarationsfunktion unvollständig, was zu einem Fehler bei der Syntaxanalyse führt.
{}.constructor, die geschweiften Klammern werden als zusammengesetzte Anweisungen verstanden, und auf die geschweiften Klammern folgt der Punktoperator. Wenn vor dem Punktoperator kein sinnvolles Objekt steht, wird natürlich ein Fehler gemeldet.
Die Lösung ist bekannt: Fügen Sie einen Zwangsoperator hinzu ()
(function(){})(), (function(){});// Erzwingen Sie, dass es als Funktion verstanden wird (Semantik 3). „Funktion ()“ bedeutet, dass die Funktion ausgeführt wird, dh sie wird sofort ausgeführt nach der Erklärung.
({}).constructor //({}) erzwingt, dass die geschweiften Klammern als Objektliterale verstanden werden (Semantik 2) bedeutet, dass die Mitglieder des Objekts erhalten werden. Natürlich kann der nachfolgende Punktoperator normal ausgeführt werden .