2017-01-25 5 views
1

Я создал навигационную переменную в глобальной области и назначил ей строку с использованием ключевого слова let.Где хранятся глобальные переменные let?

// in a browser 
    let navigator = "Hello!"; 
    console.log(navigator);      // "Hello!" 
    console.log(window.navigator === navigator); // false 

Здесь let navigator значение тенями window.navigator. Но мне очень любопытно узнать, где именно хранится let navigator?

+1

Mozilla описывает это [здесь] (https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/) следующим образом: 'Global let ... live in the scope невидимого блока, который условно охватывает весь JS-код, который выполняется на веб-странице. –

ответ

5

Поскольку вы использовали 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).

+0

Есть ли способ проверить все переменные в лексической области? Как и путь, мы можем 'console.log (window)' и видеть все связанные переменные. –

+0

@GAkshay: Nope. Это часть того, почему они были перемещены от глобального объекта, чтобы сделать их недоступными для поиска. Наряду с добавлением модулей, цель состоит в том, чтобы отказаться от использования глобального объекта для всего. –

+0

(Я должен был знать, что это было бы покрыто ответом на предыдущий вопрос.) –