Как в этой функции работает логический оператор?

У меня есть такая функция. В итоге в консоль выводит 10.

var foo = 1; 
function bar() { 
    if (!foo) { 
        var foo = 10; 
    } 
    console.log(foo); 
} 
bar();

Вопрос: Почему? Логический оператор "не" сначала берет переменную и преобразовывает к логическому типу (1 --> true), а потом переводит полученный логический тип данных к противоположному (true --> false).

Дальше в условии if мы получаем false, следовательно, условное ветвление не должно выполняться. Почему происходит выполнение if, в котором переменной присваивается новое значение?


Ответы (1 шт):

Автор решения: entithat

Почитайте подробнее о Поднятии тут.

В вашем случае код выглядит так:

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)

→ Ссылка