2016-10-15 2 views
0

AFAIK, объявления переменных поднимаются в контексте, в котором они определены, однако, в следующем коде, taken from hereJavascript: Почему, если оператор не оценивает водрузил переменную в функции

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

if(!foo) вычисляет true но Зачем? Я имею в виду var foo уже существует из этого утверждения var foo = 10 перед тем if(!foo) оцениваются в контексте Foo в поэтому if(!foo) должна решает if(!true), далее решает if(false), что означает, что если блок не должен быть выполнен, но if (!foo) оценивает верно, следовательно, код внутри, если блок выполняется и предупреждения 10

Может кто-нибудь сказать мне, почему и важно, как оценивается условие if?

+3

Вы меня сбиваете с толку – Mahi

+1

Из-за быстрого сближения ссылки, она объясняется там. – ambs

ответ

3

Добро пожаловать в Javascript "Hoisting" и это раздражает способность делать думает, что не похожи на это Выполняется :)

Итак, что происходит с тем, что Javascript не имеет возможности блока для предложений, и это компенсирует это странным образом. Я имею в виду, когда вы делаете

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

это на самом деле переводится на:

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

Перед тем, как выполняется, так что все переменные объявляются перед использованием. Исходя из этого, foo будет undefined и не глобальное значение, объявленное вне функции. Поэтому, когда вы звоните if (!foo), он будет оценивать !undefined, что всегда true.

+0

Обратите внимание, что обе переменные и объявления функций поднимаются в верхней части данной области в ES5. Таким образом, я предпочитаю следовать рекомендациям Крокфорда о _writing_ всех объявлениях функций и var в верхней части области, так что написанное аналогично тому, что происходит. Это соглашение, а не правило, но я считаю, что это упрощает чтение кода. –

+0

@ точно!И престиж для цитирования рекомендации Крокфорда :) –

0

этот 1 даст вам 1;

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

потому, что переменная Foo объявлена ​​в функции не из;) и это даст вам 1 тоже:

var foo = 1; 
function bar(x) { 
    if (!x) { 
     var x = 10; 
    } 
    alert(foo); 
} 
bar(foo); 
0

Когда функция foo скомпилирована, есть еще одно объявление переменной foo. Из-за подъема переменной в функции переменной foo будет присвоено значение undefined до тех пор, пока код не будет выполнен.

Условный оператор проверяет, если foo является falsey, как переменная undefined в данный момент времени это falsey так идет в заявлении, если где значение 10 присваивается foo.

Изменение функции foo во внутренней функции не влияет на глобальную переменную из-за объема.

Смежные вопросы