亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

老師,有些地方不太理解

老師,我想問下

代碼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深入淺出
  • 參與學習       281094    人
  • 解答問題       1054    個

由淺入深學習JS語言特性,且解析JS常見誤區,從入門到掌握

進入課程

老師,有些地方不太理解

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號