Как в этой функции работает логический оператор?
У меня есть такая функция. В итоге в консоль выводит 10.
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();
Вопрос: Почему? Логический оператор "не" сначала берет переменную и преобразовывает к логическому типу (1 --> true), а потом переводит полученный логический тип данных к противоположному (true --> false).
Дальше в условии if мы получаем false, следовательно, условное ветвление не должно выполняться. Почему происходит выполнение if, в котором переменной присваивается новое значение?
Ответы (1 шт):
Почитайте подробнее о Поднятии тут.
В вашем случае код выглядит так:
var foo = 1;
function bar() {
var foo;
if (!foo) {
foo = 10;
}
console.log(foo);
}
bar();
Переменная foo (которая внутри функции bar) будет определена только лишь после условия. Но почему же в условие попадает значение не 1, а undefined?
Потому что, срабатывает такое понятие, как "поднятие". т.е. декларация переменной foo (которая внутри функции bar) переносится в начало области видимости - т.е. функции bar:
С такого кода:
function bar() {
console.log(foo); // undefined
var foo = 10;
...
}
формально будет такой:
function bar() {
var foo;
console.log(foo); // undefined
foo = 10;
...
}
Такое свойство работает как для функций так и для переменных (но только тех, которые через var)