Проблема в том, что, понимаете ли вы это или нет, javascript незаметно перемещает все объявления var в верхнюю часть области действия функции.
так что если у вас есть такая функция
var i = 5;
function testvar () {
alert(i);
var i=3;
}
testvar();
окно предупреждения будет содержать неопределенное. потому что внутренне, это было изменено на это:
var i = 5;
function testvar () {
var i;
alert(i);
i=3;
}
testvar();
это называется "подъем".
Причина, по которой Крокфорд так настойчиво выступает за объявления var, заключается в том, что он делает код визуально совпадающим с тем, что он собирается делать, вместо того, чтобы допустить невидимое и неожиданное поведение.