b();
console.log(a);
var a = 'Hello World';
function b(){
console.log('Called b!');
}
我已经读过关于术语"吊装",但它对我来说并不是很清楚。为什么在变量设置为undefined时执行函数?
有趣的是,变量没有显示任何错误。但它显示未定义。但是当我完全删除变量时,它会显示错误。这意味着,变量存在于某处。正确?
但如果它存在,那么为什么编译器不能编译它并且可以在这里编译函数?
我知道var a正在被提升。我想知道为什么引擎以不同的方式处理变量和函数,这是执行上下文中幕后发生的事情。
任何详细的解释都会对引擎如何创建执行上下文有所帮助。
在这个问题中,我询问javascript引擎如何与函数和变量表现不同。而在执行阶段的创建状态和执行状态中究竟发生了什么。所以,这不是一个重复的问题。
答案 0 :(得分:2)
但是如果它存在,那么为什么编译器不能编译它并且可以在这里编译函数?
基本上,它归结为是否可以在不执行代码的情况下确定绑定的值。
函数声明本身不依赖于运行时信息。请记住,在调用函数之前不会对body进行求值。因此,即使没有真正执行代码,也明确b
的值是一个函数。
但是,变量声明的初始化值可能取决于运行时信息。考虑一下:
var a = 10 + bar();
引擎无法在不评估表达式的情况下“提升”初始化值(并在进程中执行bar
)。
当然,在您的示例中,初始化值('Hello World'
)也是静态的,因此可以被提升。但那时行为会不一致,可能更令人困惑。
当控件进入新函数is defined in the spec时会发生什么。在那里,您可以看到如何处理变量声明和函数声明。
答案 1 :(得分:1)
通过提升,这就是您的代码的样子
function b(){
console.log('Called b!');
}
var a;
b();
console.log(a);
a = 'Hello World';
如您所见,a
在顶部声明,但尚未设置为值。这就是您记录该变量时获得undefined
的原因。
如果您完全删除a
变量,则会获得Uncaught ReferenceError
因为a
尚未声明。
答案 2 :(得分:0)
以上代码与以下相同
var a;
function b(){
console.log('Called b!');
}
b();
console.log(a);
a = 'Hello World';
解释 - 函数及其定义被提升到顶部。提交变量声明而不是其定义
答案 3 :(得分:0)
var a;
已被悬挂。 a = 'Hello World!';
未被提升。就这么简单。