javascript局部和全局变量混淆

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,那么它将正常工作。


在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();

这叫做"提升"。

由于提升以及任何变量的作用域是它所声明的函数这一事实,在函数顶部列出所有变量是标准做法,以避免这种混淆。


它不会替换全局变量。所发生的事情被称为"可变吊装"。也就是说,var myname;被插入到函数的顶部。始终在使用变量之前初始化变量-试试这个:

1
2
3
4
5
6
7
8
9
var myname ="initial";

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

c();