ES6 のブロックレベル関数の微妙なセマンティクスを理解する
ES6 でのブロックレベル関数の導入により、徹底的な徹底が必要となる複雑さが生じました。検査。これらは厳密モードでのブロックホイスティングとスコープ制限のルールに従うという概念にもかかわらず、オプションの「Web 拡張機能」の規定によりさらに複雑な要素が作成されます。
これらのセマンティクスを明確にするために、次の表を考慮してください。さまざまな条件でのブロックレベルの関数宣言:
Mode | Web Extensions | Visible Outside Block | Hoisted | TDZ |
---|---|---|---|---|
Non-Strict, No Extensions | No | Yes, as a var | Yes, to Function and Block | Undefined Before Block |
Strict, No Extensions | No | No | Yes, to Block | N/A |
|非厳密、拡張機能付き |はい |はい、var として |はい、関数とブロックへ |関数宣言前に未定義 |
|厳密、拡張機能付き |はい |はい、var として |はい、ブロックします | N/A |
主な違いは、「厳密モード」の概念にあります。ブロックレベル関数のコンテキストでは、厳密モードは、関数宣言を含むブロックが出現する関数 (またはスクリプト)の厳密性を指します。関数の厳密性ではありません
Web 拡張機能を使用した非厳密モードでは、ブロック内の関数宣言は、その名前が仮パラメータと競合していないか、字句的に宣言されていない場合に「正常」であるとみなされます。変数。このような場合、追加の var 宣言が外側の関数スコープにホイストされ、関数宣言の評価時に関数オブジェクトがこの変数に割り当てられます。
この動作は次のコード構造を反映しています。
function enclosing(...) { var compat₀ = undefined; { let compat₁ = function compat(…) { … }; compat₀ = compat₁; } }
したがって、関数は var 宣言と同様に、ブロックの外から見えるようになります。ただし、追加のブロック スコープのバインディングがブロック内に存在します。
厳密モードでは、Web 拡張機能に関係なく、ブロックレベルの関数がブロックの先頭にホイストされ、その可視性はそのブロック内に制限されます。
前述のセマンティクスが常に実際の実装に直接変換されるわけではないことに注意することが重要です。 ES6 実装間の不一致は珍しいことではなく、実装の違いに関係なく、ES6 仕様自体を理解することの重要性を強調しています。
以上がES6 では、異なる Strict モードと Web Extensions 設定の下でブロックレベル関数はどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。