为了账号安全,请及时绑定邮箱和手机立即绑定

老师,有些地方不太理解

老师,我想问下

代码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()位置不相同,导致结果不同呢?

正在回答

4 回答

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

也就是说,var o = 1;

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

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

1 回复 有任何疑惑可以回复我~

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

1 回复 有任何疑惑可以回复我~

按照老师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();


2 回复 有任何疑惑可以回复我~

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

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281100    人
  • 解答问题       1020    个

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

进入课程

老师,有些地方不太理解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信