了解javascript提升和执行上下文

时间:2015-12-04 16:28:42

标签: javascript hoisting executioncontext

b();
console.log(a);

var a = 'Hello World';

function b(){
    console.log('Called b!');
}

我已经读过关于术语"吊装",但它对我来说并不是很清楚。为什么在变量设置为undefined时执行函数?

有趣的是,变量没有显示任何错误。但它显示未定义。但是当我完全删除变量时,它会显示错误。这意味着,变量存在于某处。正确?

但如果它存在,那么为什么编译器不能编译它并且可以在这里编译函数?

我知道var a正在被提升。我想知道为什么引擎以不同的方式处理变量和函数,这是执行上下文中幕后发生的事情。

任何详细的解释都会对引擎如何创建执行上下文有所帮助。

在这个问题中,我询问javascript引擎如何与函数和变量表现不同。而在执行阶段的创建状态和执行状态中究竟发生了什么。所以,这不是一个重复的问题。

4 个答案:

答案 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!';未被提升。就这么简单。