Estoy revisando fragmentos de código de elevación de JS. Uno de los fragmentos parece

var employeeId = 'abc123';

function foo() {
    employeeId();
    return;

    function employeeId() {
        console.log(typeof employeeId);
    }
}
foo(); 

El resultado sería: function

He leído acerca de la elevación y, según tengo entendido, todas las variables se tratarían como si estuvieran declaradas en la parte superior de la función y se inicializaran en la línea de su declaración / definición real. En este caso, el identificador de función employeeId se declararía en la parte superior de la función como var employeeId cuyo valor obviamente sería undefined y, por lo tanto, la primera línea de la función debería arrojar el error.

Hágame saber por qué el resultado es function.

1
user 22 feb. 2018 a las 18:00

2 respuestas

La mejor respuesta

Tanto las declaraciones var como las declaraciones de funciones se colocan en la parte superior del ámbito en el que ocurren (en ese orden); var s obtienen undefined como su valor, los enlaces para funciones obtienen la función como su valor. Solo una vez hecho esto, se ejecuta cualquier código paso a paso en la función.

Entonces, su ejemplo es efectivamente el mismo que este:

var employeeId;                           // Declaration
function foo() {                          // Declaration
    function employeeId() {               // Declaration (shadows outer `employeeId`)
        console.log(typeof employeeId);
    }

    employeeId();
    return;
}
employeeId = 'abc123';
foo(); 
1
T.J. Crowder 22 feb. 2018 a las 15:03

por tanto, la primera línea de la función debería arrojar el error.

No , las declaraciones de función se incluyen junto con el valor (a menos que se declare dentro de un bloque interno).

En su código

var employeeId = 'abc123';

function foo() {
    console.log(employeeId); //will print function body
    return;
      function employeeId() {
        console.log(typeof employeeId);
      }
}

Pero si la declaración de función está dentro de un bloque interno

var employeeId = 'abc123';

function foo() {
    console.log(employeeId); //will print undefined
    {
      function employeeId() {
        console.log(typeof employeeId);
      }
    }
    return;
}
0
gurvinder372 22 feb. 2018 a las 15:05