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

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

老師,有一段代碼 和EC相關,但是看了有些不明白

var?a?=?1;
function?foo()?{
????if?(!a)?{
???????var?a?=?2;
????}
????alert(a);
};

foo();

我自己的理解以為是輸出1,但是實驗發現是2.

是不是在變量初始化階段,foo這個函數體內部也會進行賦值操作。我的理解是是把初始化階段的時候是把foo存儲到VO中,然后foo中的代碼不會執行。 我以為上面代碼中的foo函數體中 var a = 2 這個操作也是 在執行階段才開始的?

正在回答

3 回答

個人理解:

初始化階段: a:undefined foo:<ref of function>

執行階段: a:1 foo:function(){ /*function*/};

然后function內開始初始化,初始化后由于沒有調用,所以沒有執行階段。

然后foo()調用,開始function內部的執行階段

0 回復 有任何疑惑可以回復我~
#1

arlenhui

好了,上面證明我和你思路是一樣的,那么為什么alert(a)是2呢? 那是因為你在函數內部也定義了一個a,局部變量和全局變量變量名相同但也是不一樣的。所以你輸出的是function內部的a=2;而不是window.a。他們不會判斷覆蓋不覆蓋
2015-05-28 回復 有任何疑惑可以回復我~
#2

樂豬 提問者

非常感謝!
2015-05-28 回復 有任何疑惑可以回復我~
#3

樂豬 提問者 回復 arlenhui

謝謝。我前幾天也在別的地方找到了正確答案,和你說的一樣。
2015-05-28 回復 有任何疑惑可以回復我~
#4

Bosn

恭喜你,理解完全錯誤。。。完全。
2015-06-05 回復 有任何疑惑可以回復我~
#5

arlenhui 回復 Bosn

我并不認為理解有誤= = 因為輸出的a確實是foo的變量a,foo初始化過程a是內部變量值為undefined取非為true,所以賦值2成功并輸出了。另外借樓問一下老師ajax跨域后取得url我想賦值url給a標簽的href,但是點擊a標簽后發現瀏覽器屏蔽了我的打開,谷歌了下是瀏覽器認為跨域的不安全所以屏蔽,有辦法解決嗎?http://runjs.cn/code/7ggk5mik
2015-06-05 回復 有任何疑惑可以回復我~
查看2條回復

這里有兩個執行環境,一個是全局,一個是foo函數調用時。


很明顯,foo函數調用時,由于有var a,所以不管執行與否都會被提前聲明。

所以最外全局的a實際上是被遮蔽了。


foo執行時,a因為是undefined,所以!a為真進入完成a = 2的賦值。


2 回復 有任何疑惑可以回復我~
#1

樂豬 提問者

感謝老師解答。 這個例子中 是不是就是if(!a) 當解析器讀到這里的時候 她發現有個a 但是這個時候不管是全局還是函數作用域中都還沒有a屬性,所以她就直接var a 。
2015-06-05 回復 有任何疑惑可以回復我~
#2

olaolaola 回復 樂豬 提問者

var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo(); alert(a) //1 , 為什么之后再alert(a)外面的沒被改變啊。
2016-03-22 回復 有任何疑惑可以回復我~
#3

飛過那座山 回復 olaolaola

因為函數中a的作用域和全局a的作用域不同,在全局VO中的a在代碼執行階段是被賦值為1
2016-06-27 回復 有任何疑惑可以回復我~

怎么樣判斷一個變量是全局變量,在控制臺中怎么驗證啊

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

舉報

0/150
提交
取消

老師,有一段代碼 和EC相關,但是看了有些不明白

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

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

幫助反饋 APP下載

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

公眾號

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