Действительно ли объявления функций перед объявлениями переменных? - PullRequest
0 голосов
/ 20 декабря 2018

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

Следующие два фрагмента кода позволяют мне думать, что в некоторых случаях объявления переменных должны предшествовать объявлениям функций:

bar();
function bar() {
  console.log(foo);
}
var foo; 

// The console will log: undefined

bar();
function bar() {
    console.log(undeclaredVariable);
}
/* As expected, the above throws:
 * "ReferenceError:  undeclaredVariable is not defined"
*/
  

В обоих случаях функция bar поднимается, поэтому я могу сразу вызвать ее в первой строке.Но если такие переменные, как foo, выводятся после функций, не должно ли console.log(foo) также выдавать ReferenceError в первом фрагменте, как console.log(undeclaredVariable) во втором фрагменте, так как он еще не был объявлен?Каков фактический порядок, когда дело доходит до того, как Javascript обрабатывает объявления переменных и подъем?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Нет, это не должно выдавать ошибку, потому что функция не оценивается, пока не будет вызвана bar().Порядок не имеет значения: ни один из них не выдаст ошибку:

var foo; 
function bar() {
  console.log(foo);
}
bar();

function bar() {
  console.log(foo);
}
var foo; 
bar();

Поскольку независимо от порядка подъема имена объявляются до вызова bar() и выполнения функции.

0 голосов
/ 20 декабря 2018

Подняты как функции, так и объявления переменных (но не присваивания).

Итак, в этом примере:

bar();
function bar() {
  console.log(foo);
}
var foo; 

Подняты и объявление функции, и объявление переменной, затем код какbar(); выполняется.

Подъем происходит, когда код JIT-компилируется, а код фактически выполняется после его компиляции.

...