Почему определение переменной не в JS, а в функции - PullRequest
1 голос
/ 03 ноября 2019

Я изучаю JS, и мне любопытно, почему функция может быть вызвана до того, как она определена и все же работает нормально. Я понимаю, что это происходит из-за того, что код сканируется заранее, чтобы ввести объявленные переменные и функции в область видимости.

Если бы это просто приводило объявления этих сущностей в область видимости, почему вызов функции также не возвращает undefined (или что-то подобное) при вызове до определения - как это делают переменные?

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Как указал ВЛАЗ в комментарии, определение переменных также поднимается. Рассмотрим этот пример:

console.log(a) // undefined 
a = 2
console.log(a) // 2
var a
console.log(b) // ReferenceError: b is not defined

Можно сказать, что undefined - это значение переменной a. Объявления функций поднимаются таким же образом, но выражения функций не являются:

foo() // foo
bar() // TypeError: bar is not a function

function foo () { 
  console.log('foo')
}

var bar = function () {
  console.log('bar')
}
1 голос
/ 03 ноября 2019

Разница декларация с var является VariableDeclaration , тогда как декларация с function ключевым словом является FunctionDeclaration .

FunctionDeclaration поднят все вместе, и в отличие от VariableDeclaration , он имеет поле body, которое содержит тело функции. Вы можете обнаружить такие различия, используя ESLint parser .

Вот почему:

someFunc();

function someFunc(){ console.log('someFunc'); } // hoisted as FunctionDeclaration
var someOtherFunc = () => {console.log('someOtherFunc');}; // not hoisted because the value of the variable is a function expression
var someNewFunc = function () {console.log('someNewFunc');}; // not hoisted because the value of the variable is a function expression

someOtherFunc();
someNewFunc();
...