javascript那些事儿——提升:零散变量问题

javascript充许在函数的任意地方声明多个变量,无论在哪里声明,效果都等同于在函数顶部进行声明。这就是所谓的“提升”。

先看一个例子,当然例子中的全局变量并不被推荐。

    myname = "global";//全局变量

    function func(){
        alert(myname);
        var myname = "local";//局部变量
        alert(myname);
    }
        
    func();

我们先来猜猜上面这段代码的执行结果。我猜是:先弹出"global"警告框,然后弹出"local"对话框。也许你会说:“Bingo!跟我想的一样!”,这是一个合乎情理的猜测,因为在第一个alert中,myname没有声明,因此函数很可能看到全局变量myname。但是结果是先弹出"undefined",然后是"local"。因为myname被看作声明为函数的本地变量(尽管是在后面声明),所有的变量声明都提升到函数的最顶层。不信?试试这个

所以,为了避免混乱,最好在开始就声明要用的所有变量。

前面的代码等价于下面的代码片段

    myname = "global";//全局变量

    function func(){
        var myname;
        alert(myname);//undefined
        myname = "local";
        alert(myname);//local
    }
        
    func();

当先使用变量再在函数后面声明变量时可能会导致逻辑错误。对javascript而言,只要变量是在同一个范围(同一函数里),就视为已经声明,哪怕是在变量声明前就使用。

参考:《Javascript模式》p17-p18


blog comments powered by Disqus