JavaScript如何提升变量?
我知道JavaScript将所有变量声明移动到函数的顶部。但是,我在下面的console.log()中都期望得到相同的结果。然而,我在第一种情况下得到NaN,在第二种情况下得到4 有人能解释一下吗?我知道在StackOverflow上也有类似的问题,但这个问题与函数定义有关。e、 例如,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); //
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() );