Javascript本地和全局变量混淆

Bha*_*oni 80 javascript

我是JavaScript的新手,我在本地和全局变量作用域上做了一些练习,以下是我的代码(小提琴):

var myname = "initial"
function c(){
    alert(myname);
    var myname = "changed";
    alert(myname);
}
c();
Run Code Online (Sandbox Code Playgroud)

当第一个警报被调用时,它显示myname为未定义.所以我的困惑是为什么我无法访问全局实例,myname如果我没有myname在函数中定义,那么它将正常工作.

Emp*_*nal 50

在Javascript中,变量声明会自动移动到函数的顶部.所以,解释器会让它看起来更像这样:

var myname = "initial"
function c(){
    var myname;
    // alerts undefined
    alert(myname);
    myname = "changed";
    // alerts changed
    alert(myname);
}
c();
Run Code Online (Sandbox Code Playgroud)

这被称为"吊装".

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

  • 你应该可以通过`window.myname`来访问它.请参见此处:http://stackoverflow.com/questions/15826751/access-overridden-global-variable-inside-a-function但全局变量通常不被认为是一种好的做法,在大多数情况下,定义它会更好一个全局对象并通过它访问它.即`var me = {myname:"initial"}`然后在函数中调用`me.myname`. (2认同)

Sri*_*r R 9

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

var myname = "initial";

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

c();
Run Code Online (Sandbox Code Playgroud)