老師,有些地方不太理解
老師,我想問下
代碼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();
我有點(diǎn)不太理解,我認(rèn)為第二個(gè)結(jié)果也應(yīng)該是1。初始化時(shí)先找函數(shù)聲明,再找變量聲明,最后執(zhí)行代碼,怎么會跟alert()位置不相同,導(dǎo)致結(jié)果不同呢?
2015-04-05
聲明前置處理,但賦值不會。
也就是說,var o = 1;
這里的var o;被前置處理。
而o = 1// 賦值,是在后面的代碼執(zhí)行階段做的,所以alert寫在前后當(dāng)然有差別。
2016-03-28
函數(shù)首先初始化,然后再進(jìn)行執(zhí)行。在兩個(gè)函數(shù)中,聲明都被提前了,但是執(zhí)行的時(shí)候,由于alert()語句的位置不同,func2先alert,此時(shí)VO中的o還未被賦值為1,因此彈出function o() {};而func1中,先執(zhí)行了o的賦值語句,再alert,此時(shí)o的值已經(jīng)改變,所以彈出了1。如果有疑惑,可以一步一步來執(zhí)行這兩個(gè)函數(shù),調(diào)試一下就知道了。
2016-02-18
按照老師vo流程處理代碼:
代碼1:function func(){
? ? ? ? ? ? ? ?function o() {}命名函數(shù)提前
? ? ? ? ? ? ? ?var o =undefined;//變量提前命名重復(fù)忽略,這里的o是function o (){}
? ? ? ? ? ? ? ?o = 1;//o給重新賦值;
? ? ? ? ? ? ? ?alert(o); ? ? ?//1
? ? ? ? ? ?}
????????????func();
代碼1:?function func(){
? ? ? ? ? ? ? ? function o() {}命名函數(shù)提前
? ? ? ? ? ? ? ? var o =undefined;//變量提前命名重復(fù)忽略,這里的o是function o (){}
? ? ? ? ? ??? ? alert(o); ? ? ? //function o() {}
? ? ? ? ? ? ? ? ?o = 1;
????????????}
????????????func();
2015-12-05
首先謝謝這位同學(xué)的問題,我也郁悶了,老師答的好簡短,還不懂。我是這這么理解的:
alert()輸出要找到變量,如果變量在此之前明確賦值了,那就是變量值優(yōu)先,函數(shù)靠邊。如果alert(o)之前o未賦值,者函數(shù)聲明優(yōu)先