2015-07-08 8 views
0

Я столкнулся с странным поведением в javascript. Рассмотрим этот код:Необычное поведение javascript

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

Это будет выводить 1. Но если удалить объявление функции Foo в третьей строке, он будет выводить 10. Почему не выход 10, когда объявление функции есть? А что является причиной, если я изменить это определение функции для этого:

foo = function(){}; 

он будет выводить 10 раз? Я знаю о подъеме объявлений функций, но, похоже, это не ответ.

+2

Когда вы выполняете функцию foo() {} ', это переопределяет имя' foo' внутри текущей области функции и скрыть глобальный. – Hacketo

ответ

0

Это не странно - у вас есть переменная, называемая foo, которую вы устанавливаете в 1 нормально. Внутри функций bar, тем foo функция

  • если присутствует, этот переменная тень
  • , если нет, то foo ссылки этого оригинальной переменной.

Как таковой, если вы определите, что функция foo, foo=10 вступит в силу, в противном случае это вступит в силу с оригинального foo.

Что касается второй части вопроса (почему она меняет назад, если вы используете var foo=...), это потому, что в этом случае объявление дублирующейся переменной объединяется в одно, поэтому вы получаете то же самое, что и вы, t написать var.

+0

Извините, я редактировал, я не хотел дублировать декларацию. Я не знал, что объявление функции затеняет глобальную переменную вместо перезаписывания. Благодарю. – Herbertusz

0

Это проблема обзора. Первый foo, определенный с помощью var, является «глобальной» переменной. Когда у вас есть функция foo, которая также является «переменной» внутри функции bar, назначение foo на 10 будет выполнено в локальной области, поэтому глобальный foo, который вы на самом деле распечатываете, не будет изменен. Однако, когда нет локального foo, присваивание внутри bar изменит глобальную переменную, таким образом, печать 10

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