Подтвердить что ты не робот

Операторы let позволяют создавать свойства на глобальном объекте?

В JavaScript объявления var создают свойства глобального объекта:

var x = 15;
console.log(window.x); // logs 15 in browser
console.log(global.x); // logs 15 in Node.js

ES6 вводит лексическое определение с помощью let деклараций с областью блока.

let x = 15;
{
   let x = 14;
}
console.log(x); // logs 15;

Однако, создают ли эти объявления свойства на глобальном объекте?

let x = 15;
// what is this supposed to log in the browser according to ES6?
console.log(window.x); // 15 in Firefox
console.log(global.x); // undefined in Node.js with flag
4b9b3361

Ответ 1

Операторы let создавать свойства на глобальном объекте?

Согласно спецификации, нет:

Глобальная запись окружения логически является одной записью, но она указана как составная инкапсуляция записи объектной среды и декларативная запись среды. Объектная запись объекта имеет в качестве базового объекта глобальный объект связанного Королевства. Этот глобальный объект - это значение, возвращаемое глобальным записям метода GetThisBinding. Компонент записи объектной среды записи глобальной среды содержит привязки для всех встроенных глобалов (раздел 18) и всех привязок, введенных функцией FunctionDeclaration, GeneratorDeclaration или VariableStatement, содержащейся в глобальном коде. Связи для всех других деклараций ECMAScript в глобальном коде содержатся в компоненте записи декларативной среды записи глобальной среды.

Еще несколько объяснений:

  • В декларативной записи среды хранятся привязки во внутренней структуре данных. Невозможно вообще овладеть этой структурой данных (подумайте о области функций).

  • Запись объектной среды использует фактический объект JS в качестве структуры данных. Каждое свойство объекта становится связующим и наоборот. Глобальная среда имеет объект объектной среды, чей "объект привязки" является глобальным объектом. Другой пример - with.

Теперь, как цитируемая часть государство, только FunctionDeclarations, GeneratorDeclarations и VariableStatements создание привязок в глобальной записи окружающей среды объекта. Т.е. только эти привязки становятся свойствами глобального объекта.

Все другие объявления (например, const и let) сохраняются в записи декларативной среды глобальной среды, которая не основана на глобальном объекте.

Ответ 2

В спецификации:

"let и const объявления определяют переменные, которые ограничены текущими контекстами выполнения LexicalEnvironment."

Это означает, что вы должны иметь доступ к переменной внутри области выполнения, но не снаружи. Это расширяет область выполнения за пределами классической структуры закрытия JS только для функций или глобальных.

Определение переменной let глобально оставляет это открытым для интерпретации, как вы видите в Firefox, оно связывает глобальную переменную, где нет V8/iojs.

Стоит отметить, что console.log(typeof x) будет returl number в iojs. На практике вам не следует определять переменные за пределами модулей или как можно больше функций... особенно с помощью const и let

Ответ 3

Переменные, объявленные через ключевое слово let, не создают доступные свойства для глобального объекта (окно для браузера). Собственно, Firefox исправил свое поведение: let v = 42; 'v' in window//false let v = 42; 'v' in window//false

Ответ 4

let позволяет вам объявлять переменные, которые ограничены в области действия блоком, оператором или выражением, в котором он используется. Это отличается от ключевого слова var, которое определяет переменную глобально или локально для всей функции независимо от области видимости блока.

На верхнем уровне программ и функций пусть, в отличие от var, не создается свойство глобального объекта. Например:

   var x = 'global';
   let y = 'global';
   console.log(this.x); // "global"
   console.log(this.y); // undefined

Область действия переменной, объявленной с помощью var, является ее текущим контекстом выполнения, который является либо включающей функцией, либо, для переменных, объявленных вне какой-либо функции, глобальным. Если вы повторно объявите переменную JavaScript, она не потеряет своего значения. Например:

var x = 1;

if (x === 1) {
  var x = 2;

  console.log(x);
  // output: 2
}

console.log(x);
// output: 2

Обратите внимание: в отличие от C, C++ и Java, JavaScript не имеет области действия уровня блока, когда вы объявляете переменную с помощью var.

Как мы упоминали ранее, let позволяет объявлять переменные, ограниченные по объему блоком, оператором или выражением, в котором он используется. Например:

let x = 1;

if (x === 1) {
  let x = 2;

  console.log(x);
  // output: 2
}

console.log(x);
// output: 1

Здесь я рекомендую вам прочитать о переменной области

Ответ 5

Переменные let и var, если они объявлены на верхнем уровне скрипта, доступны вне файла скрипта. Однако, только переменные var присваиваются объекту window. Взгляните на этот фрагмент кода в качестве доказательства:

<script>
  var namedWithVar = "with var";
  let namedWithLet = "with let";
</script>

<script>
  console.log("Accessed directly:");
  console.log(namedWithVar);        // prints: with var
  console.log(namedWithLet);        // prints: with let
  console.log("");

  console.log("Accessed through window:");
  console.log(window.namedWithVar); // prints: with var
  console.log(window.namedWithLet); // prints: undefined
</script>