2016-11-18 3 views
-2

У меня есть следующий код:JavaScript имя переменной же с именем функции

function a(x) { 
    return x * 2; 
} 

var a; 
alert(a); 

почему оповещения отображает

function a(x) { 
    return x * 2 
} 

???? ЕСЛИ я положил var a = 4, предупреждающие дисплеи 4 Но вот a будет признан как функция

Почему это происходит?

+1

Что вы ожидали бы? Переменные и функции используют одно и то же пространство имен в JavaScript, поэтому они переопределяют друг друга. – Sirko

+0

@Sirko Я бы ожидал, что undefined – joesid

+0

, если имя функции и имя переменной совпадают, то JS Engine игнорирует эту переменную. –

ответ

4

Функции являются тип объект, которые являются типом значение.

Значения могут храниться в переменных (и свойствах и передаваться как аргументы для функций и т. Д.).

Объявление функции:

  • Создает именованный функцию
  • Создает переменную в текущей области с тем же именем, что и функции (если такая переменная уже не существует)
  • Назначает функция этой переменной
  • поднято

var заявление:

  • Создает переменную в текущей области с указанным именем (если такая переменная уже не существует)
  • поднято
  • ли не присвоить значение этой переменной (если в сочетании с оператором присваивания)

Подтверждены декларации и var. Только один из них присваивает значение переменной a.

2

Если вы используете имя функции как имя переменной, ее значение заменяется на тело функции. Таким образом, «var a» становится вашей функцией «a», и, таким образом, ваше предупреждение отображает функцию «a».

3

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

Функция Декларация Overrides Variable Декларация Когда водрузили

Сначала вы объявляете переменную:

var a; // value of a is undefined 

Во-вторых, значение a является функцией, поскольку объявление функции имеет приоритет над объявлениями переменных (но не над переменным назначением):

function a(x) { 
    return x * 2; 
} 

И это то, что вы получаете, когда звоните alert(a);.

Но если вместо объявления переменной вы назначаете переменное назначение: var a = 4;, чем присвоенное значение 4 будет преобладать.

+0

Объявлены объявления функций. – Quentin

+0

Да @Quentin, но выражения не являются или называются выражениями – akinjide

+0

Да @Quentin: Объявление функции и объявления переменных поднимаются в верхнюю часть содержащейся области. И объявление функции имеет приоритет над объявлениями переменных (но не над присвоением переменной). –

1

Вы также должны помнить, что var a поднимается, что делает его больше, как это

var a; // placed 

function a(x) { 
    return x * 2; 
}; 

var a; // removed 
alert (a); // a is replaced by function body 

Помните, что var a поднимается, так что если вы назначаете 4 to a:

var a; // placed 

function a(x) { 
    return x * 2; 
}; 

var a = 4; // removed 
a = 4 // added 

alert (a); // a is now 4 
Смежные вопросы