在Node环境中运行下面的代码。在浏览器控制台中运行它不允许重新声明var的变量。
console.log(a);
var a = 5;
根据吊装,上面的代码如下所示
var a = undefined;
console.log(a); // undefined
a = 5;
a
变量正被悬挂到文件的顶部。JS引擎在执行之前为这个变量分配内存。问题是为什么下面的代码控制台是5
而不是未定义的。
var a = 5;
console.log(a);
var a = 6;
我看了这段代码,想象一下它会是这样的:
var a = 5;
var a = undefined;
console.log(a); // undefined
a = 6;
我想确定答案,而不是猜测。JS引擎足够聪明,可以看到已经声明了a
变量,并且将忽略下一个var表达式并在这种情况下重新提升?因此输出应该如下所示:
var a = 5;
console.log(a); // 5
a = 6;
所以就像:
a
变量的声明(在本例中是与初始化一起),因此它正在分配内存。a
变量的第二次声明,但将忽略提升,因为给定名称的变量已经在内存中。我做错什么了吗?
发布于 2022-09-29 12:16:11
序言:在现代JavaScript中,不应该使用var
。使用let
或const
。
JavaScript引擎分两个步骤处理var
:
var
,为它们定义变量,这些变量是通过值undefined
初始化的。如果一个变量用var
声明了不止一次,那么它就是,就好像它被声明了一次一样。然后,
var
语句( = 5
In var a = 5
)上的任何初始化器都被视为赋值。所以在这一点上,var a = 5
和a = 5
完全一样。所以在你的例子中:
var a = 5;
var a = undefined;
console.log(a); // undefined
a = 6;
它是,就好像你写了这个:
var a = 5;
a = undefined;
console.log(a); // undefined
a = 6;
或者这个:
a = 5;
var a = undefined;
console.log(a); // undefined
a = 6;
或者这个:
a = 5;
a = undefined;
console.log(a); // undefined
var a = 6;
或者这个:
var a;
a = 5;
a = undefined;
console.log(a); // undefined
a = 6;
或者这个:
a = 5;
a = undefined;
console.log(a); // undefined
a = 6;
var a;
甚至这个(但请不要!:- ):
var a = 5;
var a = undefined;
console.log(a); // undefined
var a = 6;
var a;
也就是说,首先使用var
声明的所有变量都会被创建(而且只有一次),然后代码就会运行,就好像它们上的任何初始化器都是赋值一样。
这不是let
、const
和class
声明的处理方式(统称:词汇作用域声明)。首先:同一范围内的多个声明是一个错误(包括其中一个使用var
,另一个使用词汇作用域的声明)。第二:它们被悬挂(在上面的步骤1中),但是悬挂的绑定是未初始化的,直到声明在逐步代码中被执行,此时声明被初始化(或者用初始化器的值,或者用undefined
,如果它只是let a;
)。从进入范围到初始化绑定点之间的时间称为时态死区。var
没有它,因为在创建var
变量时(使用值undefined
)会初始化它们,但是let
、const
和class
声明会初始化它们。
绑定一词是可变类事物的通用术语。在守则中:
function example(p) {
var v;
let l;
const c = 42;
function f() {
}
class C {}
}
进入example
函数的作用域时创建的绑定是p
(参数)、v
( var
变量)、l
( let
变量)、c
( const
常量)、f
(由函数声明创建的绑定)和C
(由class
声明创建的绑定)。(注意:函数和class
表达式的处理方式略有不同。)
https://stackoverflow.com/questions/73895298
复制相似问题