Переопределение переменной в цикле не делает ее неопределенной.

Имея следующий цикл for:

for (var i = 0; i < 3; ++i) {
    console.log(i, p);
    var p;
    p = 42;
}

Я ожидал, что вывод будет:

0 undefined
0 undefined
0 undefined

Но на самом деле вывод такой:

0 undefined
0 42
0 42

Поскольку мы используем var p (для повторного объявления p) в следующей строке, почему p не определено (всегда) в строке console.log?


person Nuvi Pannu    schedule 14.01.2016    source источник
comment
stackoverflow.com/ вопросы/500431/, there is no such thing as block level scope in js.   -  person Bharadwaj    schedule 14.01.2016
comment
@Bharadwaj На самом деле, в ES6 у нас есть let.   -  person Ionică Bizău    schedule 14.01.2016
comment
@IonicăBizău да, пример, приведенный OP Suites, является частью этого ответа.   -  person Bharadwaj    schedule 14.01.2016
comment
Вы спрашиваете это из любопытства? Подобные проблемы, связанные с подъемом, не будут проблемой, если вы объявите переменные вверху, как вам, скорее всего, и следует. Эту конкретную проблему можно было бы довольно легко проанализировать, пройдясь по коду с помощью отладчика. Вы бы заметили, что после выполнения второго var p; значение p не изменилось.   -  person    schedule 14.01.2016


Ответы (1)


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

ваш цикл for переведен на

var p;
for (var i = 0; i < 3; ++i) {
    console.log(i, p);
    p = 42;
}

что означает, что при первом доступе к p это undefined,

В следующий раз он уже будет инициализирован в текущей области действия функции, поэтому будет сохранено инициализированное значение.

person gurvinder372    schedule 14.01.2016
comment
@IonicăBizău понял! w3schools -› плохо :) Я думал, что это адекватно объясняет суть - person gurvinder372; 14.01.2016
comment
На самом деле, не совсем так. var p; поднимается над циклом for (в начало любой функции, в которой он находится). - person ; 14.01.2016
comment
@torazaburo понял вашу точку зрения. Обновил ответ, спасибо, что не проголосовали :). - person gurvinder372; 14.01.2016