问答详情
源自:7-3 [JavaScript]ES3执行上下文

老师,有些地方不太理解

老师,我想问下

代码1:function func(){

                var o = 1;

               function o() {}

              alert(o);      //1

           }

            func();

          /**************/

代码2: function func(){

             alert(o);       //function o() {}

             var o = 1;

             function o() {}

            }

            func();

我有点不太理解,我认为第二个结果也应该是1。初始化时先找函数声明,再找变量声明,最后执行代码,怎么会跟alert()位置不相同,导致结果不同呢?

提问者:nana_0013 2015-04-04 15:07

个回答

  • Bosn
    2015-04-05 15:31:36

    声明前置处理,但赋值不会。

    也就是说,var o = 1;

    这里的var o;被前置处理。

    而o = 1// 赋值,是在后面的代码执行阶段做的,所以alert写在前后当然有差别。

  • 妈妈说要好好学习
    2016-03-28 13:14:57

    函数首先初始化,然后再进行执行。在两个函数中,声明都被提前了,但是执行的时候,由于alert()语句的位置不同,func2先alert,此时VO中的o还未被赋值为1,因此弹出function o() {};而func1中,先执行了o的赋值语句,再alert,此时o的值已经改变,所以弹出了1。如果有疑惑,可以一步一步来执行这两个函数,调试一下就知道了。

  • qq_恶魔_0
    2016-02-18 23:46:54

    按照老师vo流程处理代码:

    代码1:function func(){

                   function o() {}命名函数提前

                   var o =undefined;//变量提前命名重复忽略,这里的o是function o (){}

                   o = 1;//o给重新赋值;

                   alert(o);      //1

               }

                func();

    代码1: function func(){

                    function o() {}命名函数提前

                    var o =undefined;//变量提前命名重复忽略,这里的o是function o (){}

                    alert(o);       //function o() {}

                     o = 1;

                }

                func();


  • 幻影af
    2015-12-05 17:14:39

    首先谢谢这位同学的问题,我也郁闷了,老师答的好简短,还不懂。我是这这么理解的:

    alert()输出要找到变量,如果变量在此之前明确赋值了,那就是变量值优先,函数靠边。如果alert(o)之前o未赋值,者函数声明优先