老師,有些地方不太理解
老師,我想問下
代碼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()位置不相同,導致結果不同呢?
2015-04-05
聲明前置處理,但賦值不會。
也就是說,var o = 1;
這里的var o;被前置處理。
而o = 1// 賦值,是在后面的代碼執行階段做的,所以alert寫在前后當然有差別。
2016-03-28
函數首先初始化,然后再進行執行。在兩個函數中,聲明都被提前了,但是執行的時候,由于alert()語句的位置不同,func2先alert,此時VO中的o還未被賦值為1,因此彈出function o() {};而func1中,先執行了o的賦值語句,再alert,此時o的值已經改變,所以彈出了1。如果有疑惑,可以一步一步來執行這兩個函數,調試一下就知道了。
2016-02-18
按照老師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();
2015-12-05
首先謝謝這位同學的問題,我也郁悶了,老師答的好簡短,還不懂。我是這這么理解的:
alert()輸出要找到變量,如果變量在此之前明確賦值了,那就是變量值優先,函數靠邊。如果alert(o)之前o未賦值,者函數聲明優先