我是 JavaScript 新手,我正在对局部和全局变量范围进行一些实践。以下是我的代码(小提琴):
var myname = "initial"
function c(){
alert(myname);
var myname = "changed";
alert(myname);
}
c();
当第一个警报被调用时,它显示myname
为未定义。所以我的困惑是为什么我无法访问全局实例,myname
如果我不在myname
函数中定义,那么它会正常工作。
我是 JavaScript 新手,我正在对局部和全局变量范围进行一些实践。以下是我的代码(小提琴):
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();
这称为吊装。
由于提升以及任何变量的作用域都是在其中声明它的函数这一事实,标准做法是在函数顶部列出所有变量以避免这种混淆。
它不会替换全局变量。正在发生的事情称为“变量提升”。也就是说,var myname;
被插入到函数的顶部。始终在使用变量之前对其进行初始化。
尝试这个:
var myname = "initial";
function c() {
alert(myname);
myname = "changed";
alert(myname);
}
c();