JavaScript如何提升变量?

JavaScript如何提升变量?,javascript,scope,Javascript,Scope,我知道JavaScript将所有变量声明移动到函数的顶部。但是,我在下面的console.log()中都期望得到相同的结果。然而,我在第一种情况下得到NaN,在第二种情况下得到4 有人能解释一下吗?我知道在StackOverflow上也有类似的问题,但这个问题与函数定义有关。e、 例如,JavaScript是否将函数变量移动到变量声明的末尾 var doB = function() { return a+1}; var b = a+1; var a = 3; console.log(b); //

我知道JavaScript将所有变量声明移动到函数的顶部。但是,我在下面的console.log()中都期望得到相同的结果。然而,我在第一种情况下得到NaN,在第二种情况下得到4

有人能解释一下吗?我知道在StackOverflow上也有类似的问题,但这个问题与函数定义有关。e、 例如,JavaScript是否将函数变量移动到变量声明的末尾

var doB = function() { return a+1};
var b = a+1;
var a = 3;
console.log(b); // NaN
console.log(doB()); // 4

a
分配给
b
时,尝试向其添加
1
时,
a
未定义

var b = undefined+1; // = NaN

由于吊装,您的代码在技术上是这样的:

var doB, b, a;
doB = function() {
    return a+1;
};
b = a + 1;
a = 3;
console.log(b); // NaN
console.log(doB()); // 4

因为代码是从上到下执行的,所以当
b
初始化为
a+1
时,
a
尚未初始化为任何内容(它是
未定义的
)。因此,实际上,
b
试图设置为
undefined+1
,即
NaN

在变量被提升后,您的代码基本上是这样运行的:

var doB;
var a;
var b;

doB = function() {
    return a + 1
};

b = a + 1;
a = 3;

console.log(b); // NaN
console.log(doB()); // 4
由于定义
b
时未定义
a
b
设置为
NaN
,如
未定义+1==NaN

a
在函数的作用域中,因此当您调用它时,
a
在JavaScript作用域中的值已经是
3

我希望使用目前我所知道的最正确的术语,我也知道它并不完全正确。我不是任何javascript大师,但您所问的这个问题与javascript范围相关。你可以找到很多关于这个话题的文章,还有一些问答等等

一步一步地 我将尝试一行一行地复制你的snipnet。如果你在某个地方注意到一个错误的术语,请发表评论,我喜欢尽我所能学习:D

第1行 方法 在当前作用域中存储名为“doB”的变量,并将其内容分配给匿名函数

所以
a
目前并不重要


第2行 方法 在当前作用域中存储名为
b
的变量,除了变量
a
之外,还将其内容分配给一个
新整数(1)

所以 此时,
a
未定义的
,因为它未在当前作用域中声明,也未从该作用域访问其他作用域。操作
undefined+a
等于
NaN
<代码>a
被指定为
NaN


第3行 方法 在当前作用域中存储名为
a
的变量,将其内容分配给
新整数(3)

所以 现在我们有了一个存储整数的变量
a


第4行 输出
NaN
,因为
b
实际上是
NaN


第5行 方法 调用函数
console.log
,其值通过调用函数
doB
返回,第一个参数不带任何参数

所以
doB
被调用并返回: a+1

也就是说
新整数(1)
除了变量
a
<代码>a
不存在于函数本地作用域上,但它存在于函数中可访问的作用域上。该值是从那里获取的,实际上是
3
。控制台输出
4

新整数(3)
对JavaScript代码没有任何意义。
var doB = function() { return a+1};
var b = a+1;
var a = 3;
console.log(b);
console.log( doB() );