Понимание подъема JavaScript и правдивости и фальсификации

Я когда-то читал о подъеме JavaScript.

Объем и перемещение JavaScript, Бен Черри
Два слова Дмитрия Сошникова о «подъеме»

и еще немного о приведении типов в JavaScript, проверке истинности и ложности: Правда, равенство и JavaScript и другие ресурсы.

Во время практики я обнаружил, что упускаю важное понятие о подъеме и переменной «правдиво и ложно».

1: проверка истинности 'if' с дублированием объявления переменной

var foo = 1; 
function bar() { 
    if (!foo) { 
    alert('inside if');
        var foo = 10; 
    } 

} 
bar();

o/p: inside if

Сомнение: значение 'foo' равно '1', if(!foo) должно оцениваться как false, и этот блок не должен выполняться (цитируется из приведенных выше ресурсов: подъем влияет только на объявление var & function, но не на выполнение) . Но почему отображается это предупреждение. Это не тот случай, если я напрямую использую false (показан в приведенном ниже коде без уловок: фрагмент № 3)

2: проверка истинности 'if' без объявления повторяющейся переменной

var foo = 1; 
function bar() { 
    if (!foo) { 
        alert('inside if');
    } 

} 
bar();

o / p: нет вывода; означает, что элемент управления не введен в блок 'if'
Это то, что можно было ожидать

3: 'if' с использованием 'false' с дублированием объявления переменной

var foo = 1; 
function bar() { 
    if (false) { 
        alert('inside if');
        var foo = 10; 
    } 
} 
bar();

o / p: нет вывода; означает, что элемент управления не введен в блок 'if'
Это то, что можно было ожидать

Кто-нибудь, пожалуйста, поясните. Спасибо


person manikanta    schedule 20.07.2011    source источник


Ответы (2)


Для вашего примера номер 1 предупреждение отображается, потому что вы используете var внутри функции, а объявление var поднимается в верхнюю часть функции, поэтому оно эквивалентно:


var foo = 1; 
function bar() {
    var foo;
    if (!foo) {
        alert('inside if');
        foo = 10; 
    } 

} 
bar();

Можно сделать вывод, что такого рода проблемы предлагают веские основания для явного объявления всех переменных в верхней части функции.

person user113716    schedule 20.07.2011
comment
Виноват. Я совсем не возражал против функции. Я концентрируюсь только на типах принуждения и подъема (они крутятся у меня в голове). Если повторяющееся объявление не находится внутри функции, то 'foo' будет иметь предыдущее значение (1) даже после второго объявления. Все эти размышления заставили меня упустить используемую функцию. Спасибо, что открыли мне глаза :) - person manikanta; 20.07.2011
comment
Почему же тогда номер три не работает? если переменная не определена, это означает, что она ложна? - person bill; 29.08.2016

Только переменная объявление быстро оценивается. Присвоение переменной в вашем первом случае (в блоке if) происходит только при входе в блок if.

Переменная, которую вы только объявляете, но не присваиваете ей никакого значения, имеет значение undefined (которое приводит к false).

person katspaugh    schedule 20.07.2011
comment
Спасибо за ответ. @patrick dw, и вы оба ответили правильно (на самом деле, спасибо за игнорирование моего невежества). Но я могу принять только один ответ, и, поскольку мистер Патрик ответил первым, я принял его. Между прочим, я и твой ответ повысил. Спасибо. - person manikanta; 20.07.2011