ES6 仕様ではブロックレベル関数が導入され、ブロック内での関数宣言が可能になります。効果的なプログラミングには、セマンティクスを理解することが重要です。
Setting | Visible Outside Block | Hoisted | Hoisting Scope | Temporal Dead Zone |
---|---|---|---|---|
Non-strict, No Web Extensions | No | No | N/A | N/A |
Strict, No Web Extensions | No | Yes | Block Level | Yes |
Non-strict, With Web Extensions | Yes | Yes | Function Level | Before Block |
Strict, With Web Extensions | Yes | Yes | Function Level | Before Block |
この文脈での「厳密モード」とは、関数自体ではなく、関数宣言を含むブロックが出現する関数またはスクリプトの厳密さによって決まります。 「Web 拡張機能」は、「健全な」関数の外観 (名前の衝突がない) のずさんな (厳密ではない) コードにのみ適用されます。
純粋な ES6 (「Web 拡張機能」なし) では、ブロック内の関数宣言は一貫したセマンティクスを持ちます。厳しさとか関係なく。これらはブロックの先頭にホイストされ、通常の関数宣言のように動作します。
「Web 拡張機能」では、スロシー モードにより追加のセマンティクスが導入されます。ブロック内の関数宣言は、var 宣言として囲んでいる関数の先頭にホイストされ、関数宣言が評価されるときに関数オブジェクトがこの変数に割り当てられます。
これにより、同じものに対して 2 つのバインディングが作成されます。識別子: 1 つは関数スコープ (ブロックの外側で表示)、もう 1 つはブロック スコープ (ブロック内でのみ表示) です。関数スコープのバインディングは、関数が宣言されるまで未定義で初期化され、宣言された時点で関数オブジェクトが割り当てられます。
ブロック実行で関数宣言が検出される前は、関数スコープのバインディングは未定義であり、アクセスしています。例外がスローされます。
以上がES6 ブロックレベル関数は、Web 拡張機能の有無にかかわらず、厳密モードと非厳密モードでどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。