2013-11-01 53 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