Модификация переменной javascript global let в локальной области [duplicate]

Это наиболее обсуждаемый аспект спецификации Selectors Level 4. С помощью этого селектора вы сможете стилизовать элемент в соответствии с его дочерним элементом, используя восклицательный знак после данного селектора (!).

Например:

body! a:hover{
   background: red;
}

установит красный цвет фона, если пользователь наводится на любой якорь.

Но нам нужно ждать реализации браузеров: (

93
задан Michał Perłakowski 19 November 2016 в 13:58
поделиться

1 ответ

let и const имеют две большие отличия от var:

  1. Они являются блочным областью .
  2. Доступ к var до его объявления имеет результат undefined; доступ к let или const, прежде чем он будет объявлен бросками ReferenceError:

console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;

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

Это не так, однако let и const подняты (например, var, class и function), но есть период между вводом области и объявлением там, где они не могут быть доступны. Этот период является временной мертвой зоной (TDZ).

TDZ заканчивается, когда aLet объявлен объявлен , а не назначен :

//console.log(aLet)  // would throw ReferenceError

let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

Этот пример показывает, что let поднят:

let x = 'outer value';
(function() {
  // start TDZ for x
  console.log(x);
  let x = 'inner value'; // declaration ends TDZ for x
}());

Кредит: временная мертвая зона (TDZ) demystified

Доступ к x во внутренней области все еще вызывает ReferenceError. Если let не были подняты, он будет записывать outer value.

TDZ - это хорошо, потому что он помогает выделить ошибки - доступ к значению до того, как он был объявлен, редко преднамерен.

TDZ также применяется к аргументам функции по умолчанию. Аргументы оцениваются слева направо, и каждый аргумент находится в TDZ до тех пор, пока он не назначен:

// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.

TDZ не включен по умолчанию в трансляторе babel.js . Включите режим «высокого соответствия», чтобы использовать его в REPL . Поставьте флаг es6.spec.blockScoping, чтобы использовать его с CLI или в качестве библиотеки.

Рекомендуемое дополнительное чтение: TDZ demystified и ES6 Let, Const и «Temporal Dead» Зона "(TDZ) в глубину .

130
ответ дан vigzmv 18 August 2018 в 22:52
поделиться
  • 1
    b is not defined (как комментарий первого фрагмента кода), но я думаю, что вы изменили имена переменных тем временем (и позже вы напишете об этом) – oliverpool 18 October 2015 в 14:12
  • 2
  • 3
    @zeroflagL хорошая ссылка, спасибо. Также он говорит: «foo не является необъявленным, он неинициализирован», этот язык был бы полезен для уточнения / исправления в вышеприведенном ответе. let foo в блоке вызывает его подъем и объявление в верхней части этого блока. Строка let foo заставляет ее инициализироваться. И foo = xyz заставляет его присваивать значение. – AJP 4 June 2017 в 01:04
  • 4
    Я думаю, что это отличный пост! Однако у меня создалось впечатление, что «пусть» не подлежит подъему? Я нашел это в документах Mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Я не пытаюсь быть кумиром, мне было просто любопытно, я открыт для разъяснения. – dmarges 3 October 2017 в 21:39
  • 5
    @jeows Страница MDN все еще говорит, что они не подняты. Вы должны попытаться изменить это, если вы действительно уверены в том, что вы говорите. Думаю, мне стоит задать вопрос. – doubleOrt 5 December 2017 в 23:01
Другие вопросы по тегам:

Похожие вопросы: