分享一篇有關(guān)變量聲明提升機制的博文

從一本有趣的js書說起

最近在逛某當搜索javascript的時候發(fā)現(xiàn)一本相當有趣的介紹js各種設(shè)計模式的教學(xué)書籍javascript設(shè)計模式(張容銘 著)這里給大家安利一下


當時看到推薦語里面的介紹說這本書是通過講述一個菜鳥程序員是如何在職場實踐中成長的就立馬勾起了我的興趣,特別是之后看到目錄里那一個個基本沒見過感覺上又很高大上的模式的詞匯更讓我下定決心要買這本書峭拘。
經(jīng)過數(shù)天的苦等蕴轨,這本勾起我強烈學(xué)習欲望的課本昨天終于到手了,恰逢今天是一星期一度的周末,剛好有很多時間可以休息和學(xué)習驹碍,于是今天就翻看了一下這本書背犯。首先第一章介紹了本書的主人公入職第一天參與項目任務(wù)時創(chuàng)建一大堆全局變量然后被教育了一整天的故事,接著第二章小白一大早就又被項目經(jīng)理教訓(xùn)了一番绍妨,然后委屈的小白去向第二主人公小銘求教润脸,小銘給小白講了一大堆面向?qū)ο缶幊痰乃枷牒头椒ǎ强吹?strong>靜態(tài)私有變量這個概念時我就懵了他去,我本科專業(yè)不是編程方向毙驯,雖然因為課程需要學(xué)過一點C語言和匯編,但對這個詞匯并沒有印象和概念(C語言沒學(xué)好)灾测,然后就引發(fā)了我今天一連串蝴蝶效應(yīng)的搜索

  • 靜態(tài)變量
  • 靜態(tài)私有變量
  • 立即執(zhí)行函數(shù)
  • Javascript函數(shù)聲明提升

在查找學(xué)習立即執(zhí)行函數(shù)相關(guān)知識通過一條外鏈讓我看到了一篇有關(guān)變量聲明提升和變量作用域Scoping & Hosting的博文爆价,博文中舉的第一個例子的“怪異”表現(xiàn)引起了我的注意

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

先說一下函數(shù)聲明提升吧

第一次接觸函數(shù)聲明提升是在

Javascript高級程序設(shè)計(第三版) 5.5.2 實際上,解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時媳搪,對函數(shù)聲明和函數(shù)表達式并非一視同仁铭段。解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問)秦爆;第七章 函數(shù)表達式 關(guān)于函數(shù)聲明序愚,他的一個重要特征就是函數(shù)聲明提升(function declaration hoisting),意思是在執(zhí)行代碼之前會先讀取函數(shù)聲明。

中接觸到的等限,但是當時只是知道函數(shù)聲明有函數(shù)聲明提升(函數(shù)在加載時會率先讀取函數(shù)聲明)這個特性爸吮,并不知道變量聲明提升這個概念,也并不清楚javascript解析器的這個機制精刷。

回到alert(a);//2

本來很想分享一下我對js解析器對函數(shù)和變量聲明提升這一機制的一些理解拗胜,但是發(fā)現(xiàn)自己編輯了差不多兩個小時也還沒進入主題,今天就先不分享了怒允,這里就簡答的指出一下原博的一個錯誤

原博錯誤處

文中說

而無論 if語句的條件如何埂软,都將為新的變量 a 賦值為 2

而實際上并不是這樣,應(yīng)該是在函數(shù)內(nèi)部聲明了變量a,而JavaScript引擎在執(zhí)行的時候勘畔,會把所有變量的聲明都提升到當前作用域的最前面所灸,即相當于在當前函數(shù)作用域的最前端聲明了一個變量a而沒有給a賦值,此時a的數(shù)據(jù)類型應(yīng)該為undefined,所以在做if判斷時a轉(zhuǎn)換成的布爾值應(yīng)該為false,因此!atrue炫七,if語句才得以執(zhí)行爬立,如果將if(!a)改成if(a)則alert(a)將會為undefined。

      var a = 1;
      function foo(){
        if(a){
          var a = 2;
         }
        alert(a);
      }
      foo();//undefined

因為真的編輯了很長時間万哪,寫得我都有點頭昏腦漲了侠驯,邏輯有點混亂了,而且實際上并沒有多少內(nèi)容奕巍,希望大家仔細研究一下原文Scoping & Hosting吟策,歡迎大家一起指正討論學(xué)習進步,謝謝大家

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末的止,一起剝皮案震驚了整個濱河市檩坚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诅福,老刑警劉巖匾委,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氓润,居然都是意外死亡赂乐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門旺芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪猴,“玉大人,你說我怎么就攤上這事采章≡耸龋” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵悯舟,是天一觀的道長担租。 經(jīng)常有香客問我,道長抵怎,這世上最難降的妖魔是什么奋救? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮反惕,結(jié)果婚禮上尝艘,老公的妹妹穿的比我還像新娘。我一直安慰自己姿染,他們只是感情好背亥,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般狡汉。 火紅的嫁衣襯著肌膚如雪娄徊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天盾戴,我揣著相機與錄音寄锐,去河邊找鬼。 笑死尖啡,一個胖子當著我的面吹牛橄仆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播可婶,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼沿癞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矛渴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤惫搏,失蹤者是張志新(化名)和其女友劉穎具温,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筐赔,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铣猩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了茴丰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片达皿。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贿肩,靈堂內(nèi)的尸體忽然破棺而出峦椰,到底是詐尸還是另有隱情,我是刑警寧澤汰规,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布汤功,位于F島的核電站,受9級特大地震影響溜哮,放射性物質(zhì)發(fā)生泄漏滔金。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一茂嗓、第九天 我趴在偏房一處隱蔽的房頂上張望餐茵。 院中可真熱鬧,春花似錦述吸、人聲如沸忿族。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肠阱。三九已至票唆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屹徘,已是汗流浹背走趋。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留噪伊,地道東北人簿煌。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鉴吹,于是被迫代替她去往敵國和親姨伟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

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