JS中變量提升和函數(shù)提升

1衣迷、變量提升

在ES6之前栋操,聲明變量都是用var,會出現(xiàn)變量提升的過程。在某些情況下搞莺,這些可能會產(chǎn)生一些小bug主穗,首先我們要知道什么是變量提升温算,它是怎么樣提升的扣草?

變量的生命周期

變量的生命周期有三部分,變量聲明(Declaration Phase)氨鹏、變量初始化(Initialization Phase)及變量賦值(Assignment Phase)

其中變量聲明時會在作用域中注冊變量欧募,初始化時是為變量分配內(nèi)存并且創(chuàng)建作用域,而此時變量會被初始化為 undefined仆抵,最后的賦值則會將指定的值分配給該變量跟继。

來看一個例子:

(function () {

    console.log(foo);   //   undefined

    var foo = "fcc";

})();

為什么會打印出undefined?而不是報錯或者fcc呢?

此處應(yīng)該扯到瀏覽器是如何解析 JavaScript 代碼的镣丑。
有三個參與者舔糖,分別是編譯器、作用域莺匠、瀏覽器引擎

1金吗、編譯器是對源代碼進行解析,以便瀏覽器能夠識別
2趣竣、在解析完成之后摇庙,瀏覽器引擎會執(zhí)行解析后的代碼
3、作用域則參與其中遥缕,在編譯過程中對于需要進行提升的變量卫袒,會將這些變量存儲在作用域中,然后在引擎執(zhí)行的過程中對其進行賦值操作

舉個例子通砍,來看看變量提升的過程:

console.log(a);     // undefined

var a = 1;

這段代碼的執(zhí)行過程應(yīng)該是:

var a;

console.log(a);

a = 1;

在執(zhí)行的過程中玛臂,遇到var,先將var 提到代碼頭部封孙,進行變量提升。
所以在console之前只是對a進行了聲明讽营,以至于打印出undefined虎忌。

2、函數(shù)提升

函數(shù)提升不同于變量提升橱鹏,他是將整個函數(shù)提升至代碼頭部膜蠢,然后執(zhí)行代碼

console.log(fun1());      //    1

function fun1 () {

    return 1;
};

這段代碼的執(zhí)行過程應(yīng)該是:

function fun1 () {

    return 1;
};

console.log(fun1 ()); 

再看一個例子:

console.log(fun2);    //    undefined

var fun2 = function () {

    return 1;

};

這里又涉及到函數(shù)聲明和函數(shù)表達式堪藐。。挑围。礁竞。。杉辙。它的執(zhí)行過程應(yīng)該是什么呢模捂?

var fun2;

console.log(fun2);

fun2 = function () {

     return 1;

}

函數(shù)聲明和函數(shù)表達式:

函數(shù)聲明即是以 function 關(guān)鍵字開始,跟隨者函數(shù)名與函數(shù)體蜘矢。而函數(shù)表達式則是先聲明函數(shù)名狂男,然后賦值匿名函數(shù)給它。

從上面的例子中可以看到:

函數(shù)表達式遵循變量提升的規(guī)則品腹,函數(shù)體不會被提升至代碼頭部:

變量提升和函數(shù)提升的順序

此處給個例子就很明白了:

console.log(fun1);       

function fun1() {

    return 1;

};

var fun1= function () {

    return 2;

};

看看執(zhí)行過程:

function fun1() {

    return 1;

};

var fun1;

console.log(fun1);  

fun1= function () {

    return 2;

};

是不是一下子就明白了岖食。

好了,睡覺舞吭!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泡垃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羡鸥,更是在濱河造成了極大的恐慌蔑穴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄春,死亡現(xiàn)場離奇詭異澎剥,居然都是意外死亡,警方通過查閱死者的電腦和手機赶舆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門哑姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芜茵,你說我怎么就攤上這事叙量。” “怎么了九串?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵绞佩,是天一觀的道長。 經(jīng)常有香客問我猪钮,道長品山,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任烤低,我火速辦了婚禮肘交,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扑馁。我一直安慰自己涯呻,他們只是感情好凉驻,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著复罐,像睡著了一般涝登。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上效诅,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天胀滚,我揣著相機與錄音,去河邊找鬼填帽。 笑死蛛淋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篡腌。 我是一名探鬼主播褐荷,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘹悼!你這毒婦竟也來了叛甫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤杨伙,失蹤者是張志新(化名)和其女友劉穎其监,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體限匣,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡抖苦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了米死。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌历。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖峦筒,靈堂內(nèi)的尸體忽然破棺而出究西,到底是詐尸還是另有隱情,我是刑警寧澤物喷,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布卤材,位于F島的核電站,受9級特大地震影響峦失,放射性物質(zhì)發(fā)生泄漏扇丛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一尉辑、第九天 我趴在偏房一處隱蔽的房頂上張望晕拆。 院中可真熱鬧,春花似錦材蹬、人聲如沸实幕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆庇。三九已至,卻和暖如春闸溃,著一層夾襖步出監(jiān)牢的瞬間整吆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工辉川, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留表蝙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓乓旗,卻偏偏與公主長得像府蛇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屿愚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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