2013-11-01 102 views
63

我是新來的JavaScript和我做對本地和全局變量的作用域的一些做法,下面是我的代碼(fiddle):的Javascript局部和全局變量混亂

var myname = "initial" 
function c(){ 
    alert(myname); 
    var myname = "changed"; 
    alert(myname); 
} 
c(); 

當第一個警報被調用,它顯示爲myname未定義。所以我的困惑是爲什麼我無法訪問全局實例myname,如果我沒有在函數內定義myname那麼它會正常工作。

+1

如果你做** alert(window.myname); **然後你會得到值 –

+0

@dholakiyaankit我試過使用window.myname它仍然在說undefined ... –

+0

@BharatSoni window.myname在我的作品瀏覽器。 – EmptyArsenal

回答

6

它不是取代全局變量。發生的事情被稱爲「變量提升」。也就是說,var myname;被插入到函數的頂部。您使用它們 之前總是初始化變量 - 試試這個:

var myname = "initial"; 
 

 
function c() { 
 
    alert(myname); 
 
    myname = "changed"; 
 
    alert(myname); 
 
} 
 

 
c();

+0

先生,我不只是試圖改變價值..你正在做的是改變全球變量本身的價值..我想了解「爲什麼」它發生的概念... –

+0

這解決了警報問題未定義,但它消除了任何局部變量,因爲它只使用全局變量'myname'。 – EmptyArsenal

+0

它不是取代全局變量。發生的事情被稱爲「變量提升」。即,myname var myname;插入到函數的頂部。在使用它們之前總是初始化你的變量,你可以參考我已經理解的這個http://stackoverflow.com/questions/11938961/understanding-global-local-scope-in​​-javascript?rq=1 –

42

在JavaScript中,變量的聲明被自動移到函數的頂部。所以,口譯員會讓它看起來更像這樣:

var myname = "initial" 
function c(){ 
    var myname; 
    // alerts undefined 
    alert(myname); 
    myname = "changed"; 
    // alerts changed 
    alert(myname); 
} 
c(); 

這叫做「提升」。

由於提升以及任何變量的作用域是它所聲明的函數這一事實,因此標準做法是在函數頂部列出所有變量以避免混淆。

+0

,所以現在有了訪問與本地變量同名的全局變量的方法.. ?? –

+2

您應該可以通過執行'window.myname'來訪問它。看到這裏:http://stackoverflow.com/questions/15826751/access-overridden-global-variable-inside-a-function但全局變量通常不被認爲是一種好的做法,在大多數情況下,它會更好地定義一個全局對象並通過它來訪問它。即'var me = {myname:'initial「}',然後在函數中調用'me.myname'。 – EmptyArsenal

+1

把變量聲明放在最前面是不正確的。例如,如果在第10行寫了var myname =「initial」,我們看到的結果不像第1行的var myname =「initial」,但實際上我們看到的行爲就好像var myname在第1行和在行10它被賦值,即myname =「initial」 – 2015-09-09 09:10:21