В чем разница между подъемом вар х = 3 и вар х - PullRequest
0 голосов
/ 22 апреля 2019

Рассмотрим два следующих фрагмента

function x(){}
var x = 3;
console.log(typeof x) //"number"

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

function x(){}
var x;
console.log(typeof x) //"function"

Я ожидаю, что тип будет undefined, потому что var x; создает переменную со значением undefined.

Ответы [ 7 ]

0 голосов
/ 22 апреля 2019

X возвращает тип функции, потому что

"В JavaScript функции - это объекты первого класса, потому что они могут иметь свойства и методы, как и любой другой объект. Что отличает их от других объектов, так это то, чтофункции могут быть вызваны. Вкратце, они являются объектами Function. "

source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

В основном вы создали 2 объекта, ссылающихся на одно и то же имя x, и потому что var x являетсябез какого-либо значения, функция возвращается, поскольку она имеет приоритет над неназначенной переменной.

0 голосов
/ 22 апреля 2019

В JavaScript необъявленной переменной присваивается значение undefined при выполнении, а также имеет тип undefined.

var a;
typeof a; //"undefined"

0 голосов
/ 22 апреля 2019

Правила подъема:

  1. Присвоение переменной имеет приоритет над объявлением функции
  2. Объявления функций имеют приоритет над объявлениями переменных

Таким образом, порядок подъема будет

Variable declaration -> Function declaration -> Variable assignment

Взгляните на эту статью , по сути, чтобы процитировать статью, причина этого заключается в том, что:

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

В этом разделе он даже содержит тот же самый пример, который вы приводили в своем вопросе.

Подводя итог, ваше объявление функции x не может "перезаписать" (hoist over) присвоение вашей переменной, но может "перезаписать" объявление вашей переменной.

0 голосов
/ 22 апреля 2019

Неопределенные переменные не будут переопределять существующие переменные.

var x = 111;
var x;
console.log(typeof x);
console.log(x);
0 голосов
/ 22 апреля 2019

Это потому, что в JavaScript, если объявляются функция и переменная с одинаковым именем и областью действия, они отображаются так:

Если переменная имеет значение или получает значение в любой точке, она поднимается наверх и имеет приоритет.
Если переменная создана, но имеет значение undefined (например, var x;), то функция имеет приоритет.

Это не происходит, когда вы явно устанавливаете значение undefined, например var x = undefined

Вот почему это происходит ( получает значение в любой точке )

function x() {}
var x;
x = 4;
console.log(typeof x);

То же самое здесь - даже с нечетной переменной и размещением функции, потому что переменная получает значение:

var x;
function x() {}
x = 5;
console.log(typeof x);
0 голосов
/ 22 апреля 2019

из-за того, что в первом разделе вы устанавливаете x как новую переменную с типом числа, другими словами, var x = 3 переопределяется на x и имеет тип числа из-за 3, но во втором разделе вы просто вызываете xи скажем, что это переменная, которая имеет тип функции.

0 голосов
/ 22 апреля 2019

var x объявляет переменную x, но не присваивает ей ничего.

Если вы установите его значение на undefined, то это будет undefined:

function x(){}
var x = undefined;
console.log(typeof x) //"undefined"

Итак, что вы сделали в своем примере, это просто

var x;
function x(){}

Хотя в моем примере это становится

var x;
function x(){}
x = undefined;
...