<script type="text/javascript">
function foo()
{
abc = function()
{
alert('@@@@@');
};
var abc = function()
{
alert('$$$$$$');
};
}
abc();
</script>上面代码会报错,但是当把var abc = function()
{
alert('$$$$$$');
};去掉时,会输出@@@@@。高手解释一下~局部变量会在局部作用域里屏蔽全局变量,离开局部作用域也会屏蔽吗?

解决方案 »

  1.   

    我不算高手, 来给你解释这个问题吧。你说的问题不是局部变量和全局变量的问题, 是javascript加载, 解析, 执行的过程问题。
    js按照在文档中出现的顺序,被加载和解析(包括引用的外部js), 解析的时候, 首先对所有的变量初始化,不管他们出现的顺序, 然后回按照function声明的顺序构造function对象,(比如后面定义的同名的function会覆盖前面的definition), 构造function 的过程同样会首先初始化function的局部变量。 最后,才开始发生调用。
    所以你的foo里面的abc不是全局的。完毕!
      

  2.   

    function foo()
    {
        abc = function()
        {
            alert('@@@@@');
        };
    //首先js的代码是要经过预编译的 如果你不删这段函数 它预编
    //译到这里会把abc当作局部变量(因为你是var的) 因此你在foo函数外边调用foo函数里边的abc是不行的
    //如果你去掉了这段函数 那么它把abc当作全局变量 全局变量外边自然可以访问
        var abc = function()     {
            alert('$$$$$$');
        };
    }
    abc();