05 JS 聲明提升

關(guān)于編譯器,引擎會在解釋 JS 代碼之前首先對其進行編譯精绎。編譯階段的一部分工作就是找到所有的聲明速缨,并用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來。

1.聲明提升

“提升”就是變量和函數(shù)聲明從它們在代碼中出現(xiàn)的位置被“移動”到了最上面代乃,這個過程就叫“提升”旬牲。

// 代碼示例 1
foo();
function foo() {
    console.log(a); // undefined
    var a = 2;
}

如上面代碼示例 1, foo 函數(shù)的聲明被提升了搁吓,因此第一行中的調(diào)用可以正常執(zhí)行引谜。需要注意的是,每個作用域都會進行提升操作擎浴。也就是函數(shù)自身也會在內(nèi)部對 var a 進行提升,所以最終的形式可以理解為如下代碼示例 2:

// 代碼示例 2
function foo() {
    var a;
    console.log(a); // undefined
    a = 2;
}
foo();

2.函數(shù)表達式不會被提升

// 代碼示例 3
foo(); // TypeError 類型錯誤

var foo = function bar() {
     // ...
}

foo() 由于對 undefined 值進行函數(shù)調(diào)用而導(dǎo)致非法操作毒涧,因此拋 TypeError 出異常贮预。

3.函數(shù)優(yōu)先

函數(shù)聲明會被提升到普陀變量之前。

// 代碼示例 4
foo(); // 1

var foo;

function foo() {
    console.log(1);
}

foo = function() {
    console.log(2);
}

上述代碼示例 4 會被引擎理解為如下形式:

function foo() {
    console.log(1);
}

foo();  // 1

foo = function() {
  console.log(2);
}

重復(fù)的函數(shù)聲明可以覆蓋前面的契讲。

盡可能避免在塊內(nèi)部聲明函數(shù)仿吞。

總結(jié)

  • var a = 2; 其中 var a; 是編譯階段的任務(wù),a = 2; 是執(zhí)行階段的任務(wù)捡偏;
  • 所有的聲明(變量和函數(shù))都會被“移動”到各自作用域的最頂端唤冈,這個過程叫“提升”;
  • 聲明本身會被提升银伟,而包含函數(shù)表達式在內(nèi)的賦值操作不會被提升你虹;
  • 避免重復(fù)聲明。

注:文章參考總結(jié)自 《你不知道的 JavaScript 上卷》[美] KYLE SIMPSON 著 第 42 頁彤避。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傅物,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琉预,更是在濱河造成了極大的恐慌董饰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圆米,死亡現(xiàn)場離奇詭異卒暂,居然都是意外死亡,警方通過查閱死者的電腦和手機娄帖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門也祠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人块茁,你說我怎么就攤上這事齿坷」鸺。” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵永淌,是天一觀的道長崎场。 經(jīng)常有香客問我,道長遂蛀,這世上最難降的妖魔是什么谭跨? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮李滴,結(jié)果婚禮上螃宙,老公的妹妹穿的比我還像新娘。我一直安慰自己所坯,他們只是感情好谆扎,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芹助,像睡著了一般堂湖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上状土,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天无蜂,我揣著相機與錄音,去河邊找鬼蒙谓。 笑死斥季,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的累驮。 我是一名探鬼主播酣倾,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慰照!你這毒婦竟也來了灶挟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤毒租,失蹤者是張志新(化名)和其女友劉穎稚铣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墅垮,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡惕医,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了算色。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬伺。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灾梦,靈堂內(nèi)的尸體忽然破棺而出峡钓,到底是詐尸還是另有隱情妓笙,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布能岩,位于F島的核電站寞宫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拉鹃。R本人自食惡果不足惜辈赋,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膏燕。 院中可真熱鬧钥屈,春花似錦、人聲如沸坝辫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽近忙。三九已至腻脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間银锻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工做鹰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留击纬,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓钾麸,卻偏偏與公主長得像更振,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饭尝,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容