В своей статье о let
и const
Джейсон Орендорф заявляет следующее:
Краткие сведения о производительности: в большинстве случаев вы можете сказать, было ли выполнено объявление, просто взглянув на код, поэтому движку JavaScript фактически не нужно выполнять дополнительную проверку каждый раз при доступе к переменной, чтобы убедиться, что она была инициализирована. . Однако внутри замыкания это иногда неясно. В этих случаях движок JavaScript выполнит проверку во время выполнения. Это означает, что
let
может быть немного медленнее, чемvar
.
Я решил попытаться найти пример, где это верно, и был поставлен в тупик.
Например, давайте посмотрим на следующий сценарий пыток:
function doSomethingDumb(q) {
function crash() { ++x; }
q.fn = crash;
crash();
let x;
return crash;
}
Несмотря на то, что замыкание возвращается в конце функции, гарантируется, что оператор return никогда не будет выполняться, даже если x
назначен члену q
(и, таким образом, может уйти в дикую природу) x
никогда не будет инициализирован, поэтому crash
всегда будет падать.
В каком случае нельзя было бы сказать, инициализирована ли переменная?
crash()
даже не будет выполняться, он уже вылетает при попытке назначитьx
наq.fn
. - person Bergi   schedule 11.04.2017