Javascript代码片段

Javascript代码片段,javascript,hoisting,Javascript,Hoisting,我正在浏览JS的代码片段。其中一个片段看起来像 var employeeId = 'abc123'; function foo() { employeeId(); return; function employeeId() { console.log(typeof employeeId); } } foo(); 输出为:函数 我已经阅读了关于提升的内容,根据我的理解,所有变量将被视为在函数顶部声明,并在其实际声明/定义行初始化。在这种情况下

我正在浏览JS的代码片段。其中一个片段看起来像

var employeeId = 'abc123';

function foo() {
    employeeId();
    return;

    function employeeId() {
        console.log(typeof employeeId);
    }
}
foo(); 
输出为:
函数

我已经阅读了关于提升的内容,根据我的理解,所有变量将被视为在函数顶部声明,并在其实际声明/定义行初始化。在这种情况下,
employeeId
函数标识符将在函数顶部声明为
var employeeId
,其值显然是
undefined
,因此函数的第一行应该抛出错误


请让我知道为什么输出是
function

所有
var
声明和函数声明都被提升到它们出现的范围的顶部(按该顺序)
var
s将
undefined
作为其值,函数的绑定将函数作为其值。只有在完成之后,才能执行函数中的任何分步代码

因此,您的示例实际上与此相同:

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

    employeeId();
    return;
}
employeeId = 'abc123';
foo(); 
因此,函数的第一行应该抛出错误

,函数声明将与值一起提升(除非在内部块中声明)

在代码中

var employeeId = 'abc123';

function foo() {
    console.log(employeeId); //will print function body
    return;
      function employeeId() {
        console.log(typeof employeeId);
      }
}
但是如果函数声明在内部块中


你的问题是什么?
var employeeId = 'abc123';

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