Javascript在函数内部提升变量

时间:2014-09-09 18:13:28

标签: javascript closures

我是javascript关闭概念的新手。据我所知,运行时调用对象存储对参数,局部变量和函数命名参数的引用。有了这个,我试着解决下面的片段。

    function a(){
        var o=10;
         function b(){
             alert(o);
             var o=20;
             alert(o);    
         }
        alert(o);
        b();
    }
    a();

我希望答案能够提醒10,20,20,但它是10,未定义,20。因为b的调用对象存储对所有局部变量的引用,所以b中的第一个警报(o)应该给出20,但是为什么undefined会来?即使在b()中,var o在alert(o)之后的某个时间点定义,对于那个场景,它不应该从父作用域访问o吗?有人可以透过一些亮点!

1 个答案:

答案 0 :(得分:1)

  

因为b的调用对象存储对所有局部变量的引用

是。首先是局部变量,然后是父范围变量。

  

b中的第一个警报(o)应该给20,但为什么未定义?

这里有两个o个变量:一个位于a范围内,另一个位于b范围内。由于提升,var o=20的变量声明适用于整个b范围,在调用o时将b()变量(最初未定义)引入范围。

也许这更有意义:

function a(){
    var o; // hoisted
    function b(){ // hoisted
        var o; // hoisted
        alert(o);
        o=20;
        alert(o);    
    }
    o=10;
    alert(o);
    b();
}
a();

顺便说一下,你还没有经历过closure,它的显着特点是父作用域与子函数对象持久存在,即使父函数有return ed。