2016-12-29 87 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

相關問題