2014-10-27 2 views
2

Я просматривал вокруг интернета и наткнулся на эту функцию JavaScriptКак понять вывод моей функции в JavaScript

function foo(){ 
     function bar() { 
      return 3; 
     } 
     return bar(); 
     function bar() { 
      return 8; 
     } 
    } 
    console.log(foo()); 
    =>8 

Это действительно запутанной, почему эта функция возвращает 8, когда она вызывается. Я бы предположил, что этот код исчерпал бы содержимое функции и остановился на return bar(); и вернул 3. Что мне здесь не хватает?

+2

Это потому, что объявления функций получить водрузили к верхней части блока. – zakangelle

+1

функции поднимаются - неважно, было ли это объявлено после утверждения, он все равно может быть запущен. Последняя 'bar()' перезаписывает первую. – tymeJV

+0

Просто любопытно, это вопрос чисто академической ценности? Зачем кому-то писать такой код? Серьезно, есть ли веская причина? –

ответ

3

Это результат переменного подъема. function определения идут раньше всего. Это действительно выглядит так

function foo(){ 
    var bar; 
    bar = function() { 
     return 3; 
    } 
    bar = function() { 
     return 8; 
    } 
    return bar(); 
} 

«Поскольку объявления переменных (и декларации в целом) обрабатываются до любого кода выполняется, объявив переменную в коде эквивалентно объявлению его на самом верху.» varMDN

+0

Возможно, стоит упомянуть, что использование «var bar = function() {...}' в исходном коде действительно имеет значение здесь. –

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