这是示例:
function b() {
console.log(f);
{
function f() {}
}
}
b()
我认为它将变成:
function b() {
// hoist to function scope
function f() {}
console.log(f); // should output function f
}
或
function b() {
console.log(f); // should output reference error
{
// just hoist to block scope like this
function f() {}
}
}
,但它输出未定义的内容,例如var
提升。为什么?
答案 0 :(得分:0)
{}
创建了块作用域,因此
JS引擎会像这样解释您的代码
function b() {
console.log(f);
{
var f = function f() {};
}
}
b();
因此,由于f
的块作用域范围,无法在块外使用。并且由于它被定义为var,因此被提升到父级的作用域(函数b的作用域),结果是未定义
如果您删除{}
。
function b() {
console.log(f);
function f() {}
}
b()
答案 1 :(得分:0)
这是由于吊装。 function f() {}
在一个块内,因此console.log(f)无法访问function f() {}
,这超出了范围。但是,如果将console.log(f)
保留在块{}
中。吊装应该可以。