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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js的作用域

js的作用域

函數式編程 2019-04-10 20:48:47
vara=1;functionb(){a=10;return;functiona(){}}b();console.log(a);控制臺打出來是1,在b函數中不是有a=10嗎,這樣聲明是一個全局變量吧,,為什么打印的是1,是不是在全局這個范圍找到的a的聲明就不會去函數里找a的聲明啦??求解。。謝謝大家
查看完整描述

2 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

JavaScript解釋器中存在一種變量聲明被提升(hoisting)的機制,也就是說變量
(函數)的聲明會被提升到作用域的最前面,即使寫代碼的時候是寫在最后面,也還是
會被提升至最前面。
例如以下代碼段:
alert(foo);//functionfoo(){}
alert(bar);//undefined
functionfoo(){}
varbar=functionbar_fn(){};
alert(foo);//functionfoo(){}
alert(bar);//functionbar_fn(){}
輸出結果分別是functionfoo(){}、undefined、functionfoo(){}和function
bar_fn(){}。
可以看到foo的聲明是寫在alert之后,仍然可以被正確調用,因為JavaScript解釋
器會將其提升到alert前面,而以函數表達式創建的函數bar則不享受此待遇。
那么bar究竟有沒有被提升呢,其實用var聲明的變量都會被提升,只不過是被先賦值
為undefined罷了,所以第二個alert彈出了undefined。
所以,JavaScript引擎執行以上代碼的順序可能是這樣的:
創建變量foo和bar,并將它們都賦值為undefined。
創建函數foo的函數體,并將其賦值給變量foo。
執行前面的兩個alert。
創建函數bar_fn,并將其賦值給bar。
執行后面的兩個alert。
注:
嚴格地說,再JavaScript中創建函數的話,還有另外一種方法,稱為“函數構造法”:
varfoo=Function('alert("hi!");');
varfoo=newFunction('alert("hi!");');//等同于上面一行
此方法以一個字符串作為參數形成函數體。但是用這種方法,執行效率方面會打折扣,
且似乎無法傳遞參數,所以少用為妙。
                            
查看完整回答
反對 回復 2019-04-10
  • 2 回答
  • 0 關注
  • 349 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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