我是JavaScript的新手,我正在练习本地和全局变量作用域。以下是我的代码(fiddle):
var myname = "initial"
function c(){
alert(myname);
var myname = "changed";
alert(myname);
}
c();
myname
为未定义。所以我很困惑,为什么我不能访问全局实例myname
,如果我不在函数内定义myname
,那么它将正常工作。我是JavaScript的新手,我正在练习本地和全局变量作用域。以下是我的代码(fiddle):
var myname = "initial"
function c(){
alert(myname);
var myname = "changed";
alert(myname);
}
c();
myname
为未定义。所以我很困惑,为什么我不能访问全局实例myname
,如果我不在函数内定义myname
,那么它将正常工作。在JavaScript中,变量声明会自动移到函数的顶部。因此,解释器会使其看起来更像这样:
var myname = "initial"
function c(){
var myname;
// Alerts undefined
alert(myname);
myname = "changed";
// Alerts changed
alert(myname);
}
c();
这被称为变量提升。
由于变量提升和任何变量的作用域都是其声明所在的函数,因此通常建议在函数顶部列出所有变量,以避免混淆。
window.myname
来访问它。请参见此处:https://dev59.com/YXDYa4cB1Zd3GeqPBo0a 但是,全局变量通常不被认为是一种良好的实践,在大多数情况下最好定义一个全局对象,并通过该对象访问它。例如 var me = { myname: "initial" }
,然后在函数中调用 me.myname
。 - EmptyArsenalvar myVariable
并不会自动将其变为全局变量。通常,如果在前面没有任何内容声明 myVariable
,它就会成为全局变量(除非在函数中已经有作用域/设置)。但是最好在这样做时使用 window.
。再说了,尽可能避免使用全局变量 :P - redfox05它并没有替换全局变量。发生的是“变量提升”。也就是说,var myname;
会被插入到函数顶部。在使用变量之前,请始终对其进行初始化。
尝试这样做:
var myname = "initial";
function c() {
alert(myname);
myname = "changed";
alert(myname);
}
c();
myname
。 - EmptyArsenal