Поскольку вы использовали let
вместо var
, он сохраняется в декларативной environment record, связанную с глобальным lexical environment object, а не на самом глобальном объекте. Записи среды и объекты лексической среды являются механизмами спецификации и не доступны непосредственно в коде (и, следовательно, их реализация может варьироваться в зависимости от механизма JavaScript).
Это концепция — Глобал, которые не являются свойством глобального объекта — новой вещь введен с ES2015; до тех пор все глобальные переменные были свойствами глобального объекта. Начиная с ES2015 привязки идентификаторов глобального уровня let
, const
и class
не хранятся на глобальном объекте, а вместо этого на отдельной декларативной записи среды.
Записи среды и лексические объекты среды - это те же самые механизмы, что и в ES2015 +, а также в ES5 и более ранних версиях для хранения локальных переменных внутри функции.
Глобальный аспект этого определяется в §8.2.3 - SetGlobalRealmObject, который, в свою очередь, ссылается на §8.1.2.5 - NewGlobalEnvironment(G, thisValue).
Mozilla описывает это [здесь] (https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/) следующим образом: 'Global let ... live in the scope невидимого блока, который условно охватывает весь JS-код, который выполняется на веб-странице. –