重复声明同一个变量

下面有两个小栗子

var a = 1;
var a = 2;
console.log(a); // 2
var a = 1;
var a;
console.log(a); //1

上面第一个栗子很好理解,再次声明同一个变量会覆盖掉之前的变量,但是第二个栗子为什么不是输出undefined呢?

我有一个理解方式不知道对不对,可以从变量提升的角度去理解,上面的代码经过变量提升就可以改写成下面这样,因为变量提升只提升声明不提升赋值

var a;
var a;
a = 1;
console.log(a);

刚刚去查了资料,参考《JavaScript高级程序设计》第7.3章节,原话如下

JavaScript从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见(不过,它会执行后续声明中的变量初始化)。

阅读 9.2k
6 个回答
不在这叙述大段的文字来讲述了。如果想要深入了解这个原因,或者从规范的角度来解释。可以看下老版规范中,执行上下文和变量对象,激活对象的解释,这些概念都有中文翻译的博客之类的。这几个概念会从实现原理上通俗的讲下,在解释器阶段和代码执行阶段,一个标识符是如何与一个值进行绑定的。还有诸如,一个变量名为a和函数名为a,同名情况下,执行上下文会取哪个值,诸如此类问题,对你理解词法环境(新版规范)和作用域,作用域链,闭包都有很大帮助。而变量声明提升,也只是在这些基础概念上,后人总结出来的一句话。

你的理解是对的,就是变量提升了

你的理解是对的,就是这么回事儿。

忍不住立马去查了资料,参考《JavaScript高级程序设计》第7.3章节,原话如下

JavaScript从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见(不过,它会执行后续声明中的变量初始化)。

因此只是JavaScript的特性,和变量提升无关。

理解正确,javascript中存在变量提升,建议去看一下es6的let声明和const声明

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题