Порядок подъема в JavaScript


function g () {
    var x;
    function y () {};
    var z;
}

Я хотел бы точно знать, в каком порядке этот код становится при подъеме.

Теория 1: порядок между vars и functions остается как есть:

function g () {
    var x;
    function y () {};
    var z;
}

Теория 2: vars приходят раньше functions:

function g () {
    var x;
    var z;
    function y () {};
}

Теория 3: functions приходят раньше vars:

function g () {
    function y () {};
    var x;
    var z;
}

Какая теория верна?

1 6

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.