Это наиболее обсуждаемый аспект спецификации Selectors Level 4. С помощью этого селектора вы сможете стилизовать элемент в соответствии с его дочерним элементом, используя восклицательный знак после данного селектора (!).
Например:
body! a:hover{
background: red;
}
установит красный цвет фона, если пользователь наводится на любой якорь.
Но нам нужно ждать реализации браузеров: (
let
и const
имеют две большие отличия от var
:
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) в глубину .
b is not defined
(как комментарий первого фрагмента кода), но я думаю, что вы изменили имена переменных тем временем (и позже вы напишете об этом) – oliverpool 18 October 2015 в 14:12let foo
в блоке вызывает его подъем и объявление в верхней части этого блока. Строкаlet foo
заставляет ее инициализироваться. Иfoo = xyz
заставляет его присваивать значение. – AJP 4 June 2017 в 01:04