JS では中括弧には 4 つの意味関数があります
セマンティクス 1、複合文を整理する、これが最も一般的です
次のようにコードをコピーします。
if(条件) {
//...
}それ以外 {
//...
}
のために() {
//...
}
セマンティクス 2、オブジェクト リテラル宣言
次のようにコードをコピーします。
var obj = {
名前:「ジャック」、
年齢: 23
};
全体は代入ステートメントであり、{name:'jack',age:23} が式です。
セマンティクス 3、関数または関数リテラルの宣言
次のようにコードをコピーします。
関数 f1(){
//...
}
var f2 = 関数(){
//...
}
f1 と非 f2 の違いは、前者が構文解釈期間にあり、後者が実行時にあることです。違いは、関数を呼び出すコードが関数定義の後にある場合は違いがありませんが、関数を呼び出すコードが関数定義の前にある場合は f1 を呼び出すことはできますが、f2 はエラーを報告して、その旨を通知します。 f2は定義されていません。
セマンティクス 4、構造化例外処理の構文表記
次のようにコードをコピーします。
試す {
//...
}キャッチ(元){
//...
}ついに{
//...
}
ここの中括弧と一致するステートメント (意味 1) には違いがあります。中括弧内のステートメントが 1 つだけの場合、if/else/for などでは中括弧を省略できますが、try/catch/finally は省略できません。省略。
私は次のコードに長い間苦労してきました
次のようにコードをコピーします。
function(){}() //匿名関数を即時実行、構文解析定期レポート
{}.constructor //オブジェクト リテラルのコンストラクターを取得します。構文解析中にエラーが報告されます
不可解なのは、なぜ [].constructor がこのように書かれているのにエラーを報告しないのかということです。1 つはオブジェクトの直接の値を取得したいコンストラクターであり、もう 1 つはオブジェクトの直接の値を取得したいだけのコンストラクターです。配列。
もちろん、受信する変数を追加してもエラーは発生しません。
var c = {}.constructor;
同じ状況は次のようなものです
var fn = function(){}() はエラーを報告しません。
実際、問題を引き起こしているのは js の「ステートメントの優先順位」です。つまり、{} はオブジェクト リテラル (セマンティック 2) や宣言された関数のセマンティックスではなく、複合ステートメント ブロック (セマンティック 1) として理解されます (意味3)。
function(){}() の中括弧は複合ステートメントとして認識されます。当然、前の function() 宣言関数の構文は不完全であるため、構文解析中にエラーが発生します。
{}.constructor では、中括弧は複合ステートメントとして認識され、中括弧の後にドット演算子が続きます。ドット演算子の前に適切なオブジェクトがない場合は、当然エラーが報告されます。
この修正はよく知られています。強制演算子 () を追加します。
(function(){})(), (function(){});//強制的に関数として理解させます (セマンティック 3)。「function()」は関数の実行を意味します。つまり、すぐに実行されます。宣言後。
({}).constructor //({}) は、中括弧をオブジェクト リテラルとして強制的に解釈します (意味 2)。「Object.xx」は、オブジェクトのメンバーを取得することを意味します。当然、後続のドット演算子は正常に実行できます。 。