ホームページ >ウェブフロントエンド >フロントエンドQ&A >JavaScriptにおける中括弧の使用法は何ですか
JavaScript における中括弧の使用: 1. 複合ステートメントを整理するために使用されます; 2. オブジェクトを定義するために使用され、ほとんどの場合、プロパティと値のペアが必要です; 3. 関数または関数の直接量を宣言するために使用されます。 4. 構造化例外処理の構文記号として使用されます。
このチュートリアルの動作環境: Windows 10 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
JavaScript における中括弧 "{}" には 4 つのセマンティック機能があります:
セマンティクス 1. 複合ステートメントを整理します。最も一般的です:
if( condition ) { //... }else { //... } for() { //... }
セマンティック 2、オブジェクト リテラル宣言:
var obj = { name : 'jack', age : 23 };
全体は代入ステートメントであり、その中で {name:'jack' ,age:23} は式です。
セマンティクス 3、関数または関数リテラルを宣言します:
function f1(){ //... } var f2 = function(){ //... }
f1 と非 f2 の違いは、前者は構文解釈期間にあり、後者は構文解釈期間にあることです。ランタイム中です。違いは、関数を呼び出すコードが関数定義の後にある場合は違いがありませんが、関数を呼び出すコードが関数定義の前にある場合は f1 を呼び出すことはできますが、f2 はエラーを報告し、次のことを要求します。 f2は定義されていません。
セマンティクス 4、構造化例外処理の文法記号:
try { //... }catch( ex ){ //... }finally{ //... }
ここの中括弧と準拠するステートメント (セマンティクス 1) の間には違いがあります。文は1つだけで、if/else/forなどの中括弧は省略できますが、try/catch/finallyは省略できません。
私は次のコードに長い間苦労しています:
function(){}() //匿名函数立即执行, 语法分析期报 {}.constructor //获取对象直接量的构造器,语法分析期报错
不可解なのは、[].constructor がこのように書かれているのにエラーを報告しない理由です。1 つはコンストラクターです。オブジェクトの直接の値を取得したいものは、配列リテラルを取得するための単なるコンストラクターです。
もちろん、受信する変数を追加してもエラーは報告されません。var c = {}.constructor;
同じ状況では、var fn = function(){} () の場合、エラーは報告されません。
実際に問題を引き起こしているのは js の「ステートメントの優先順位」です。つまり、{} はオブジェクト リテラル (セマンティック 2) のセマンティックスではなく、複合ステートメント ブロック (セマンティック 1) として理解されます。宣言された関数 (セマンティック 3)。
function(){}()、中括弧は複合文として理解されます。当然、前の function() 宣言関数の構文が不完全であるため、構文解析中にエラーが発生します。 {}.constructor では、中括弧は複合ステートメントとして認識され、中括弧の後にドット演算子が続きます。ドット演算子の前に適切なオブジェクトがない場合は、当然エラーが報告されます。
この修正はよく知られています: 必須の演算子を追加します ()
(function(){})(), (function(){});//強制的に関数として理解される (意味論 3)、「Function ()」は関数の実行を意味します。つまり、関数は宣言の直後に実行されます。 ({}).constructor //({}) は中括弧をオブジェクト リテラルとして強制的に理解させます (意味 2)。「Object.xx」はオブジェクトのメンバーを取得することを意味します。当然、後続のドット演算子は通常どおり実行できます。
function(){}(); 構文エラーの理由は、(); 関数呼び出し演算子とは関係ありません。
本質的な理由は、function(){} が字句解析期間に従ってトークンを効果的にグループ化しているためです。 function は、この ExpressionStatement の開始位置の最初のトークン要素とみなされます。これは EMCA262 では許可されていません。それが許可されない理由は非常に明確で、関数式と関数宣言の間に曖昧さが生じることを恐れているからです。 function キーワードを ExpressionStaement の最初の場所に置くことはできないことが理解できます。
代入文を見てみましょう f = function(){};
f : LeftHandSideExpression = : AssignmentOperator
function(){}; このとき、全体の代入式部分とみなされます。ステートメント、つまり AssignmentExpression です。したがって、合理的かつ合法的に文法チェックを通過し、関数式になりました。FunctionExpression.
つまり、この時点では、 f = function(){}(); としても、文法的には合法です。
関連する推奨事項: JavaScript 学習チュートリアル
以上がJavaScriptにおける中括弧の使用法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。