var foo = 'hello';
var myfunc = function() {
console.log(foo);
var foo = foo || 'world';
console.log(foo);
}
myfunc();
Почему первый foo зарегистрирован как 'undefined'?javascript variable access mystery
var foo = 'hello';
var myfunc = function() {
console.log(foo);
var foo = foo || 'world';
console.log(foo);
}
myfunc();
Почему первый foo зарегистрирован как 'undefined'?javascript variable access mystery
Потому что на какой строке вы фактически объявляете переменную с помощью «var», не имеет значения, если она остается в той же функции. Если функция имеет var x
, объявленную где угодно, любая ссылка на это имя считается локальной для области, в которой она объявлена.
Конечно, как правило, вы не ссылаться на переменную, прежде чем он объявлен, но рассмотреть этот фрагмент кода:
function foo(a) {
if (a) {
var b = "something";
}
console.log(b);
}
Переменная b
является локальной для этой функции, следовательно, независимо от значения a
, использование b
воны Случайно ссылайтесь на переменную, объявленную в охватывающей области.
Примечание: javascript имеет только область видимости уровня, у него нет области измерения уровня кадра.
+1, точно вправо. Подробнее: http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html –
Зачем вам делать то, что вы сделали в добавленном фрагменте? Внедряет проблемы обслуживания без реальной выгоды. –
Нет, компилятор видит оператор 'var foo' и компилирует foo как локальную переменную. Затем, когда код интерпретируется, foo еще не определено, чтобы иметь какое-либо значение. Следовательно, это значение «неопределено». Помните, что есть две фазы: компиляция и исполнение. Все объявления переменных и функций обрабатываются во время компиляции. Но назначение должно выполняться во время выполнения, потому что вам нужно оценить выражения, чтобы получить правильное значение. – slebetman