search

Home  >  Q&A  >  body text

javascript - 一道js面试题,觉得和变量提升有关

(function(){
    a = 5;
    alert(window.a);
    var a = 10;
    alert(a);
})();

这个先打印出 undefined 然后是10,为什么呀?

天蓬老师天蓬老师2895 days ago300

reply all(8)I'll reply

  • 阿神

    阿神2017-04-10 15:23:16

    第一个 a=5 没用var, 它并没有创建变量a, 而是向上级作用域找变量a, 自然是找不到, 所以会创建a, 但创建的a是本域的, 不是window域(顶级域)的, 所以window.a还是undefined .

    (function(){
        a = 5;
        alert(a);           //==> 5
        alert(window.a);    //==> undefined
        var a = 10;
        alert(a);           //==> 10
    })();
    

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:23:16

    首先明确2点:
    1、js中没有带var关键字的变量都是隐式全局变量
    2、js中存在变量提升

    上述的代码等效于:

    var a=undefined;  
    (function(){
        var a;    //局部变量a,默认值是undefined
        a = 5;    //因和局部变量名相同,因此全局变量a被覆盖,此处变成了给局部变量a赋值
        //alert(a);  弹出5
        //a只是变量,而不是属性 alert(a in window)返回false  ,参见http://segmentfault.com/q/1010000002883076 的第一个回答
        alert(window.a);  
        a = 10;
        alert(a);
    })();
    

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:23:16

    可以查看该问答 http://segmentfault.com/q/1010000002589542

    reply
    0
  • 阿神

    阿神2017-04-10 15:23:16

    因为a在下面被声明过了,所以预解释为undefined,window.a之前a没有赋值,所以为undefined,下面的a声明并且赋值所以为10

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:23:16

    @不写代码的码农 首先他的回答已经很好了,希望你明白,作为初学者,说说我个人的比较通俗的理解,望指正。

    javascript    (function(){
        a = 5;            
        alert(window.a);  
        var a = 10;    //由于声明提前,var a是这个匿名函数中的局部变量,js引擎会在执行前
                      // 最先编译。
                       //所以,第一行的a=5其实不是创建了全局变量,而是对编译期间的局部变量
                       // a赋值5.
                       //但是,为何alert(window.a)会是undefined,是因为他指定了要输出的
                       //是window.a
                       //这是要输出window的属性a,没有这个a,因此会是输出undefined(此
                       //处,我也有疑问,
                       //为何不会出现referenceError),之后再赋值10,那么输出的就是10了
        alert(a);
    })();
    

    其中,我不明白的地方提出来了,可能有误,希望指正。-----初学

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:23:16

    (function(){
        a = 5; 
        alert(window.a);
        var a = 10;
        alert(a);
    })();

    你可以把那个未声明的变量a当作不存在 这样就会好一些

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:23:16

    (function(){

    a = 5; //没有用var声明的变量,它才会在全局对象(即当前作用域链的最顶层对象,如window对象创建一个变量--全局变量),所以window.a应该相当于var a;所以window.a是undefined。
    alert(window.a);
    var a = 10;
    alert(a);

    })();

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:23:16

    需要知道js的预编译模式的函数声明会先找到变量赋值语句,并将其置于函数顶,赋值为undefined.
    了解完这个自己就能读懂了, 虽然a=5看上去是声明了一个全局变量,但是后面有一个var a = 10所以导致变量提升,所以代码预编译完成之后会变成下面这个样子:

    (function(){
            var a;    //    undefined
        a = 5;    //    5
        alert(window.a);    //此时的a的scope是该函数
        var a = 10;    //10
        alert(a);    //10
    })();

    reply
    0
  • Cancelreply