var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)
Я видел код выше, функция объявлена в {}. Я думаю, что это напечатало бы 0 0, но это печатает 0 5
javascript
Маркус Ли
источник
источник
0 undefined
.a = 5
оставляет блок. По словам Берги в дупе,function a
будут подняты.Ответы:
Происходит следующее:
(1) Существуют два объявления переменных
a
, одно внутри блока и одно вне его.(2) Объявление функции поднимается и привязывается к переменной внутренних блоков.
(3)
a = 5
достигается, что переопределяет блочную переменную.(4) объявление функции достигнуто, и блочная переменная копируется во внешнюю переменную. Оба 5 сейчас.
(5)
a = 0
достигается, что переопределяет блочную переменную. На внешнюю переменную это не влияет.На самом деле это не является частью спецификации, это является частью семантики совместимости с устаревшим веб-интерфейсом , поэтому не объявляйте функции внутри блоков и не полагайтесь на этот код, который будет вести себя таким образом .
Это также объясняется здесь
источник