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

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

函數聲明和聲明變量同時存在,提升的規則是什么?

函數聲明和聲明變量同時存在,提升的規則是什么?

慕容森 2018-11-07 10:18:45
我們知道聲明變量是會提升的:var a = 1;//上面一行相當于下面這樣: var a; a = 1;同時,函數聲明也是會被提升的:foo();function foo(){};//上面兩行相當于下面這樣: var foo; foo = function (){}; foo()那么,變量和函數聲明都有時,誰會提升到更上面呢?怎么排序呢?比如下面這樣:var a = 1; foo();function foo(){};是這樣嗎?var a;var foo; a = 1; foo = function(){}; foo();因為在《你不知道的JAVASCRIPT》看到這句話,有點困惑:函數聲明和變量聲明都會被提升。但是一個值得注意的細節是,函數會首先被提升,然后才是變量。函數聲明會被提升到普通變量之前。所以說會是這樣排序嗎:var foo; foo = function(){};var a; a = 1; foo();求解排序規則,謝謝!
查看完整描述

1 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

首先,我們可以把它分為4塊內容

var a ;
a =1;
foo();function foo();

我們想知道提升后排序是什么形式? 
目前已知條件是,變量聲明會提升到變量賦值之前,所以我們可以先將變量聲明放到前兩位,暫時不管其內部順序:

var a ;function foo(){};
a=1;
foo();

接下來我們來分別確定聲明和賦值模塊的內部排序。 
為了進行實驗,我們對foo函數進行擴充,所以現在的排序為:

var a;function foo(){console.log(a+1)};
a=1;
foo();

先不要管為什么這么改,我們繼續實驗,實驗過程中會理解。
為了便于理解,實驗分兩次進行。
首先:我們對變量聲明模塊進行實驗。

var a=1;
console.log(foo);//若輸出為function foo(){}則證明函數聲明位于變量聲明之前;若為undefined,說明相反。
foo();function foo(){console.log(a+1)};

然后:我們對變量賦值模塊進行實驗。

var a=1;
foo();//若輸出為undefined1,則證明foo()在a=1之前;若輸出為2,則說明a=1在foo()之前。function foo(){console.log(a+1)};

下面來進行實驗:

var a=1;
console.log(foo);//若輸出為function foo(){}則證明函數聲明位于變量聲明之前;若為undefined,說明相反。
foo();function foo(){console.log(a+1)};

VM1099:2 function foo(){console.log(a+1)}
VM1099:4 2

根據實驗結果,我們最后得出的排序結果是:

function foo(){};var a;
a=1;
foo();


查看完整回答
反對 回復 2018-12-14
  • 1 回答
  • 0 關注
  • 466 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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