2016-03-03 147 views
-1

你能幫我理解JS爲什麼這樣工作嗎?Javascript未定義的變量函數內部重新定義

var timer = 3; 
var func = function() { 
    alert(timer); 
    var timer = 5; 
} 
func(); 

它返回我「未定義」。

如果我做

var timer = 3; 
var func = function() { 
    alert(timer); 
    timer = 5; 
} 
func(); 

它按預期工作(警報3)。

這是與範圍,我不明白正確的東西。 不應該在警報之後覆蓋「timer」的定義嗎?

僅在鉻上進行測試。

謝謝你們。

+0

它被稱爲'變量提升'..只是查找相同的。 – gurvinder372

+0

吊裝。無論何時定義'var xxx','var'定義都會被移動到作用域的頂部(在本例中爲函數的第一行;在alert()之前)。 – h2ooooooo

回答

4
​​

這段代碼在js解釋時變成了這個;

var timer = 3; 
var func = function() { 
    var timer; // Here local variable timer is undefined 
    alert(timer); // here local var timer alerts rather than global var timer 
    timer = 5; // here timer got initialized 
} 

這是因爲在JavaScript提升的概念。你可以閱讀提升frome here

+0

雖然這是事實,但您應該給出一個或兩個解釋變量提升的鏈接,而不是「這是發生的事情」。 – h2ooooooo

+0

或者將其標記爲DUPE ... – Rayon

0

變量提升是令人討厭的javascript'提升'(發送變量聲明)到當前範圍的頂部。

但是,它不會將初始化發送到當前作用域的頂部。

所以:

​​

變爲:

var timer = 3; 
var func = function() { 
    var timer; 
    alert(timer); 
    timer = 5; 
} 

當它被解釋。

提起(對許多開發人員)JavaScript的未知或被忽視的行爲。

如果開發人員不理解提示,程序可能包含錯誤(錯誤)。

爲了避免錯誤,請始終在每個範圍的開頭聲明所有變量。

因爲這是JavaScript解釋代碼的方式,所以它總是一個很好的規則。