2016-12-29 88 views
9

开放,开发者控制台(或node.js中),通过序列输入以下代码:关于var/const,为什么这段代码会起作用?

a = 1 
var a = 2 
const a = 3 

screenshot1

正如你可以看到它的工作原理,但如果你一次输入所有的代码,你会得到一个错误,我认为这是比较合理的screenshot2

我想唯一的区别在于起升,如果你输入所有的代码同时,它也将被处理:

var a 
a = 1 
a = 2 
const a = 3 

但我不明白为什么当你用行中输入线,它的工作原理,如果你还跳过前行,你会得到一个错误预期

enter image description here

+0

有趣的现象!您可能会暴露控制台环境的某些特定行为。 –

+0

@AndyRay我尝试在node.js和不同的浏览器中,我得到了相同的结果 – CodinCat

+4

我可以想象,在第一种情况下'var'实际上被忽略,因为全局对象上已经有一个名为'a'的属性(因为'a = 1')。因为这实际上并没有任何宣布'var a'的信息。正如你在第二种情况中指出的那样,'var a'被挂起,因此在'a = 1'发生之前处理,所以不会被忽略。但是,这是猜测,控制台/ REPL环境可能会做奇怪的事情。 –

回答

1

在环境变量的全局作用域可以分配和声明,不管类型如何,因此当您按顺序输入以下代码时,它将起作用。 z与

z = 1 
var z = 2 
const z = 3 

值是3,现在

现在让我们说我们执行这个一次性

z = 4; var z = 5; const z = 6; 

的z值仍为3

在这种情况下,解释器将引发错误,因为在这里它会尝试执行所有上述语句作为一个块,现在它已经找到了'z'的多个声明,因此会为整个块引发一个错误,并且不会执行即使是第一部分即z = 4;

的一切是在一次执行的语句是相当于

(function foo(){ z = 4; var z = 5; const z = 6; })(); 
+2

您可以注意到一件事情。如果我们使用dev工具来定义变量'a',它会附加到窗口对象,并且如果添加'const a',它不会添加到窗口对象 var a = 2; 您填写查找window.a的值为2 并且您输入 const a = 3; 您仍然注意到,window.a值保持相同意味着2. – spankajd

+0

因此,基本上如果将所有行放在一个作为块作用域的行中,并且const z不能更改其他任何作为z无效的行。但是如果z是在不同的行上声明的,每行都被认为是自己的作用域,所以const值不适用于它们? – zer00ne

相关问题