Порядок подъема в JavaScript
function g () {
var x;
function y () {};
var z;
}
Я хотел бы точно знать, в каком порядке этот код становится при подъеме.
Теория 1: порядок между var
s и function
s остается как есть:
function g () {
var x;
function y () {};
var z;
}
Теория 2: var
s приходят раньше function
s:
function g () {
var x;
var z;
function y () {};
}
Теория 3: function
s приходят раньше var
s:
function g () {
function y () {};
var x;
var z;
}
Какая теория верна?
1 ответ:
Сначала поднимаются функции, затем объявления переменных, в соответствии с ECMAScript 5, раздел 10.5 , который определяет, как происходит подъем:
Сначала у нас есть Шаг 5, обрабатывающий объявления функций:
Для каждой FunctionDeclaration f в коде, в исходном тексте порядок do...
Затем Шаг 8 обрабатывает
var
объявления:Для каждого VariableDeclaration и VariableDeclarationNoIn d в коде, в исходном тексте порядок do...
Итак, функции они имеют более высокий приоритет, чем операторы
var
, поскольку более поздние операторыvar
не могут перезаписать ранее обработанное объявление функции. (Substep 8c принудительно выполняет условие " если varAlreadyDeclared имеет значение false, то [продолжить...] "таким образом, существующие привязки переменных не перезаписываются.)Вы также можете увидеть это экспериментально :
function f(){} var f; console.log(f); var g; function g(){} console.log(g);
Оба вызова
log
показывают функцию, а не значениеundefined
.