首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >var提升与重声明之间的值

var提升与重声明之间的值
EN

Stack Overflow用户
提问于 2022-09-29 12:07:24
回答 1查看 47关注 0票数 1

在Node环境中运行下面的代码。在浏览器控制台中运行它不允许重新声明var的变量。

代码语言:javascript
运行
复制
console.log(a);
var a = 5;

根据吊装,上面的代码如下所示

代码语言:javascript
运行
复制
var a = undefined;
console.log(a); // undefined
a = 5;

a变量正被悬挂到文件的顶部。JS引擎在执行之前为这个变量分配内存。问题是为什么下面的代码控制台是5而不是未定义的。

代码语言:javascript
运行
复制
var a = 5;
console.log(a);
var a = 6;

我看了这段代码,想象一下它会是这样的:

代码语言:javascript
运行
复制
var a = 5;
var a = undefined;
console.log(a); // undefined
a = 6;

我想确定答案,而不是猜测。JS引擎足够聪明,可以看到已经声明了a变量,并且将忽略下一个var表达式并在这种情况下重新提升?因此输出应该如下所示:

代码语言:javascript
运行
复制
var a = 5;
console.log(a); // 5
a = 6;

所以就像:

  1. JS引擎第一次看到a变量的声明(在本例中是与初始化一起),因此它正在分配内存。
  2. JS引擎将看到a变量的第二次声明,但将忽略提升,因为给定名称的变量已经在内存中。

我做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-29 12:16:11

序言:在现代JavaScript中,不应该使用var。使用letconst

JavaScript引擎分两个步骤处理var

  1. 在输入全局作用域或函数作用域时,处理整个作用域中的每个var,为它们定义变量,这些变量是通过值undefined初始化的。如果一个变量用var声明了不止一次,那么它就是,就好像它被声明了一次一样。

然后,

  1. 开始逐步执行代码.在这一步执行中,var语句( = 5 In var a = 5)上的任何初始化器都被视为赋值。所以在这一点上,var a = 5a = 5完全一样。

所以在你的例子中:

代码语言:javascript
运行
复制
var a = 5;
var a = undefined;
console.log(a); // undefined
a = 6;

它是,就好像你写了这个

代码语言:javascript
运行
复制
var a = 5;
a = undefined;
console.log(a); // undefined
a = 6;

或者这个:

代码语言:javascript
运行
复制
a = 5;
var a = undefined;
console.log(a); // undefined
a = 6;

或者这个:

代码语言:javascript
运行
复制
a = 5;
a = undefined;
console.log(a); // undefined
var a = 6;

或者这个:

代码语言:javascript
运行
复制
var a;
a = 5;
a = undefined;
console.log(a); // undefined
a = 6;

或者这个:

代码语言:javascript
运行
复制
a = 5;
a = undefined;
console.log(a); // undefined
a = 6;
var a;

甚至这个(但请不要!:- ):

代码语言:javascript
运行
复制
var a = 5;
var a = undefined;
console.log(a); // undefined
var a = 6;
var a;

也就是说,首先使用var声明的所有变量都会被创建(而且只有一次),然后代码就会运行,就好像它们上的任何初始化器都是赋值一样。

这不是letconstclass声明的处理方式(统称:词汇作用域声明)。首先:同一范围内的多个声明是一个错误(包括其中一个使用var,另一个使用词汇作用域的声明)。第二:它们被悬挂(在上面的步骤1中),但是悬挂的绑定是未初始化的,直到声明在逐步代码中被执行,此时声明被初始化(或者用初始化器的值,或者用undefined,如果它只是let a;)。从进入范围到初始化绑定点之间的时间称为时态死区。var没有它,因为在创建var变量时(使用值undefined)会初始化它们,但是letconstclass声明会初始化它们。

绑定一词是可变类事物的通用术语。在守则中:

代码语言:javascript
运行
复制
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表达式的处理方式略有不同。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73895298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档