2012-11-17 170 views
0

可能重複:
variable hoisting局部變量影響全局變量 - JavaScript變量的作用域

var a = "global"; 

    //version 1 
    function changeGlobal(){ 
     alert(a); //why is 'a' undefined here? 
     if(a){ 
     var a = "local"; 
     alert(a); 
     } 
    } 
    //version 2 
    function changeGlobal(){ 
     alert(a); //why is 'a' 'global' here? what diff does 'var a="local"' make? 
     if(a){ 
     //var a = "local"; 
     alert(a); 
     } 
    } 
    changeGlobal(); 

問題是內聯。幫助我瞭解變量範圍。

+1

這個問題不是重複的,即「變量提升」,即「全局範圍」,表現出實現異常,儘管它是相關的。 – 2012-11-17 03:27:23

+0

@jAndy有很多JS的問題,我試着在看這對夫婦之前試過。另外,我正在閱讀'Alexei White'的書'javascript',並且他從來沒有談論過懸掛。 –

+0

爲什麼你的函數具有相同的名稱,爲什麼'var a ='local''在後者中被註釋掉了?我們應該如何確定哪些函數被稱爲變量被設置的順序? –

回答

4

在JavaScript中,變量聲明被'懸掛'到函數的頂部,與您聲明它們的位置無關。

因此,在changeGlobal的第一個變體中,當您聲明var a = "local"時,a變量聲明被懸掛到頂部。變量的賦值也不會被掛起,所以在你提醒a時,它的一個未賦值變量,因此未定義。

也就是說,

function changeGlobal(){ 
    alert(a); //why is 'a' undefined here? 
    if(a){ 
    var a = "local"; 
    alert(a); 
    } 
} 

相當於

function changeGlobal(){ 
    var a; // hoisted here (not assigned a value yet) 
    alert(a); //why is 'a' undefined here? 
    if(a){ 
    a = "local"; // only assigned a value here 
    alert(a); 
    } 
} 
2

在版本1聲明命名a一個局部變量優先於全球achangeGlobal函數中。儘管它在alert(a);調用之後定義,但它的定義將被「懸掛」直到示波器的開始,但直到var a = "local";行纔會被初始化。這就是爲什麼alert(a);顯示undefined

在版本2中,由於本地不存在a,因此您總是在處理全局函數a,該函數在函數運行前已經初始化。

1

JavaScript有詞法作用域,當變量可從程序/功能被解除引用它在哪裏var版,和下(如,引用它不會拋出ReferenceError
var語句也將被懸掛,和初始值設置爲undefined

還是在外行人而言,變量的作用域來定義它們在功能,並且所有的變量都可以在功能執行雖然值可能尚未分配過程中的任何一點。

結合起來,這就是你所觀察到的ing - 映射全局變量的局部變量。

+0

我會說「函數範圍」(因爲ECMAScript沒有塊範圍,通常與詞法範圍相關聯),並省略「解除引用」(這甚至意味着什麼!?!)的用法。術語ReferenceError是由變量/屬性語法結構在內部分解爲「引用」(根據規範)的事實而產生的,但不應該將它與「需要爲引用進行使用」相混淆。 – 2012-11-17 04:14:24