老师,我想问下
代码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()位置不相同,导致结果不同呢?
声明前置处理,但赋值不会。
也就是说,var o = 1;
这里的var o;被前置处理。
而o = 1// 赋值,是在后面的代码执行阶段做的,所以alert写在前后当然有差别。
函数首先初始化,然后再进行执行。在两个函数中,声明都被提前了,但是执行的时候,由于alert()语句的位置不同,func2先alert,此时VO中的o还未被赋值为1,因此弹出function o() {};而func1中,先执行了o的赋值语句,再alert,此时o的值已经改变,所以弹出了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();
首先谢谢这位同学的问题,我也郁闷了,老师答的好简短,还不懂。我是这这么理解的:
alert()输出要找到变量,如果变量在此之前明确赋值了,那就是变量值优先,函数靠边。如果alert(o)之前o未赋值,者函数声明优先