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