Javascript local and global variable confusion
我刚接触到JavaScript,在本地和全局变量范围上做了一些实践,下面是我的代码(fiddle):
1 2 3 4 5 6 7
| var myname ="initial"
function c(){
alert(myname);
var myname ="changed";
alert(myname);
}
c(); |
当调用第一个警报时,它显示myname未定义。所以我的困惑是为什么我不能访问myname的全局实例,如果我没有在函数中定义myname,那么它将正常工作。
- 如果您发出警报(window.myname);那么您将获得值
- @我试过用window.myname,但它仍然说未定义…
- @bharatsoni window.myname在我的浏览器中工作。
- 它应该起作用,巴拉特
- @我试过拉小提琴。没有工作
- jsfiddle.net/xjmbf/6在我的浏览器中,这也可以工作
- 它可能不会在小提琴中工作,因为JSfiddle可能有它自己的范围,尽管我对JSfiddle的了解还不够,不能肯定地说。
- var myname="initial"不是全局变量。它只能从当前的Javascript作用域访问。如果您想要声明一个全局变量,那么不要使用"var"关键字,而thar变量应该是window对象中的一个属性。
在javascript中,变量声明会自动移动到函数的顶部。所以,口译员会让它看起来更像这样:
1 2 3 4 5 6 7 8 9 10
| var myname ="initial"
function c(){
var myname;
// alerts undefined
alert(myname);
myname ="changed";
// alerts changed
alert(myname);
}
c(); |
这叫做"提升"。
由于提升以及任何变量的作用域是它所声明的函数这一事实,在函数顶部列出所有变量是标准做法,以避免这种混淆。
- 我已经理解了,所以现在有方法访问与局部变量同名的全局变量。???
- 您应该可以通过执行window.myname来访问它。请参见:stackoverflow.com/questions/15826751/…,但是通常不认为全局变量是一个好的实践,在大多数情况下,最好定义一个全局对象并通过它访问它。即var me = { myname:"initial" },然后在函数中调用me.myname。
- 说变量声明在顶部移动是不正确的。例如,如果在第10行中,它被写入var myname="initial",我们看到的结果与在第1行中var myname="initial"不同,但实际上,我们看到的行为就好像var myname在第1行,而在第10行中,它被赋值,即myname="initial"
- 另外,请注意,在函数外部使用var myVariable不会自动使其成为全局的。通常在声明myVariable时,前面没有任何内容会使它成为一个全局(除非它在函数中的作用域/集更早),但这样做时最好使用window.。同样,在可能的情况下,尽量避免使用全局变量:p
它不会替换全局变量。所发生的事情被称为"可变吊装"。也就是说,var myname;被插入到函数的顶部。始终在使用变量之前初始化变量-试试这个:
1 2 3 4 5 6 7 8 9
| var myname ="initial";
function c() {
alert(myname);
myname ="changed";
alert(myname);
}
c(); |
- 先生,我不只是想改变价值……您要做的是更改全局变量本身的值。我想理解"为什么"这个概念。
- 这解决了警报未定义的问题,但它消除了任何局部变量,因为它只使用全局变量myname。
- 它不会替换全局变量。所发生的事情被称为"可变吊装"。也就是说,myname var myname;被插入到函数的顶部。始终在使用变量之前初始化变量,您可以参考stackoverflow.com/questions/11938961/…