0
b();
console.log(a);

var a = 'Hello World';

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

我读过“吊装”这个词,但对我来说不是很清楚。为什么当变量设置为未定义时函数会被执行?

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

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

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

任何详细的解释都将有助于了解引擎如何创建执行上下文。

在这个问题中,我问的是 javascript 引擎对函数和变量的行为有何不同。以及执行阶段的创建状态和执行状态到底发生了什么。所以,这不是一个重复的问题。

4

4 回答 4

2

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

基本上它归结为是否可以在不执行代码的情况下确定绑定的值。

函数声明本身不依赖于运行时信息。请记住,在调用函数之前不会评估主体。所以即使没有真正执行代码,很明显的值b是一个函数。

但是,变量声明的初始化值可能取决于运行时信息。考虑一下:

var a = 10 + bar();

引擎无法在不评估表达式(并bar在进程中执行)的情况下“提升”初始化值。

当然,在您的示例中,初始化值 ( 'Hello World') 也是静态的,因此可以提升它。但随后行为将不一致,可能更令人困惑。


当控制进入一个新功能时究竟会发生什么在规范中定义。在那里您可以看到如何处理变量声明和函数声明。

于 2015-12-04T16:36:25.893 回答
1

使用提升,这就是您的代码的样子

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

b();
console.log(a);

a = 'Hello World';

如您所见,a在顶部声明,但尚未设置为值。这就是为什么您undefined在记录该变量时得到的原因。

如果您a完全删除该变量,您将得到Uncaught ReferenceError因为a尚未声明。

于 2015-12-04T16:30:24.927 回答
0

var a;被吊起。a = 'Hello World!';没有吊起。就是这么简单。

于 2015-12-04T16:35:43.853 回答
0

上面的代码和下面的一样

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

a = 'Hello World';

说明 - 函数及其定义被提升到顶部。变量声明被提升而不是其定义

于 2015-12-04T16:30:18.403 回答