Я пытаюсь обернуть голову новыми стандартизованными функциями уровня блока в ES6, читая исходную спецификацию. Мое поверхностное понимание было:
- В ES6 разрешены объявления функций уровня блока.
- Они поднимаются в верхнюю часть блока.
- В строгом режиме они не видны за пределами содержащего блока.
Однако это еще больше осложняется тем фактом, что часть этих семантик указана как "необязательная" и обязательна только для веб-браузеров (Приложение B). Поэтому я хотел бы заполнить следующую таблицу:
| Visible outside of block? | Hoisted? Up to which point? | "TDZ"? | ------------------------------------------------------------------------------------------------------------------------ | Non-strict mode, no "web extensions" | | | | | Strict mode, no "web extensions" | | | | | Non strict mode, with "web extensions | | | | | Strict mode, with "web extensions" | | | |
Также мне непонятно, что означает "строгий режим" в этом контексте. Это различие, по-видимому, представлено в приложении B3.3 в качестве части дополнительных шагов для выполнения декларации функции:
1. If strict is false, then
...
Однако, насколько я вижу, strict
относится к внутреннему слоту [[Strict]]
объекта функции. Означает ли это, что:
// Non-strict surrounding code
{
function foo() {"use strict";}
}
следует рассматривать как "строгий режим" в таблице выше? Однако это противоречит моей первоначальной интуиции.
Пожалуйста, имейте в виду, что меня интересует сама спецификация ES6, независимо от фактических несоответствий в реализации.