x
будет 20. var
«поднят» (см. Ниже), что означает, что переменная объявляется как начало функции, прежде чем запускается любой пошаговый код. Любой инициализатор в операторе var
фактически представляет собой оператор присваивания.
Так что ваш код:
function foo() {
var x = 10;
//do something
var x = 20;
console.log("x: " + x);
}
рассматривается как если бы это было так:
function foo() {
var x;
x = 10;
//do something
x = 20;
console.log("x: " + x);
}
При вызове функции, двигатель JavaScript делает несколько вещей перед тем он начинает выполнять пошаговый код в вопросе. одна из вещей, которые она делает, - это просмотреть код и обработать любые var
заявления. (Хотя это называется var
заявление, var
больше из декларации.)
Это довольно весело, ваш код может быть записан следующим образом:
function foo() {
x = 10;
//do something
x = 20;
console.log("x: " + x);
return;
var x;
}
Это все равно будет действительным, и его будет делать то же самое.
больше (в моем блоге): Poor, misunderstood var
ES6 представит let
, который ведет себя по-разному (помимо всего прочего, это области видимости блока он находится, в то время как var
является областью видимости функции в целом, даже если объявленный в блоке); details on MDN.
Любая причина, вы не можете просто проверить его? – Scimonster
Переменная будет 20. Однако, если вы используете строгий режим, как и следовало ожидать, приведенное выше даст вам сообщение об ошибке. – Nit
Вы можете попробовать это самостоятельно перед публикацией. 2 минуты Google ответят. – Birlla