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


當(dāng)時(shí)看到推薦語里面的介紹說這本書是通過講述一個(gè)菜鳥程序員是如何在職場(chǎng)實(shí)踐中成長(zhǎng)的就立馬勾起了我的興趣,特別是之后看到目錄里那一個(gè)個(gè)基本沒見過感覺上又很高大上的模式的詞匯更讓我下定決心要買這本書。
經(jīng)過數(shù)天的苦等,這本勾起我強(qiáng)烈學(xué)習(xí)欲望的課本昨天終于到手了,恰逢今天是一星期一度的周末,剛好有很多時(shí)間可以休息和學(xué)習(xí),于是今天就翻看了一下這本書。首先第一章介紹了本書的主人公入職第一天參與項(xiàng)目任務(wù)時(shí)創(chuàng)建一大堆全局變量然后被教育了一整天的故事,接著第二章小白一大早就又被項(xiàng)目經(jīng)理教訓(xùn)了一番,然后委屈的小白去向第二主人公小銘求教,小銘給小白講了一大堆面向?qū)ο缶幊痰乃枷牒头椒?,但是看?strong>靜態(tài)私有變量這個(gè)概念時(shí)我就懵了,我本科專業(yè)不是編程方向,雖然因?yàn)檎n程需要學(xué)過一點(diǎn)C語言和匯編,但對(duì)這個(gè)詞匯并沒有印象和概念(C語言沒學(xué)好),然后就引發(fā)了我今天一連串蝴蝶效應(yīng)的搜索
- 靜態(tài)變量
- 靜態(tài)私有變量
- 立即執(zhí)行函數(shù)
- Javascript函數(shù)聲明提升
在查找學(xué)習(xí)立即執(zhí)行函數(shù)相關(guān)知識(shí)通過一條外鏈讓我看到了一篇有關(guān)變量聲明提升和變量作用域Scoping & Hosting的博文,博文中舉的第一個(gè)例子的“怪異”表現(xiàn)引起了我的注意
var a = 1;
function foo() {
if (!a) {
var a = 2; }
alert(a);};
foo();//2}
先說一下函數(shù)聲明提升吧
第一次接觸函數(shù)聲明提升是在
Javascript高級(jí)程序設(shè)計(jì)(第三版) 5.5.2 實(shí)際上,解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時(shí),對(duì)函數(shù)聲明和函數(shù)表達(dá)式并非一視同仁。解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問);第七章 函數(shù)表達(dá)式 關(guān)于函數(shù)聲明,他的一個(gè)重要特征就是函數(shù)聲明提升(function declaration hoisting),意思是在執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明。
中接觸到的,但是當(dāng)時(shí)只是知道函數(shù)聲明有函數(shù)聲明提升(函數(shù)在加載時(shí)會(huì)率先讀取函數(shù)聲明)這個(gè)特性,并不知道變量聲明提升這個(gè)概念,也并不清楚javascript解析器的這個(gè)機(jī)制。
回到alert(a);//2
本來很想分享一下我對(duì)js解析器對(duì)函數(shù)和變量聲明提升這一機(jī)制的一些理解,但是發(fā)現(xiàn)自己編輯了差不多兩個(gè)小時(shí)也還沒進(jìn)入主題,今天就先不分享了,這里就簡(jiǎn)答的指出一下原博的一個(gè)錯(cuò)誤

文中說
而無論 if語句的條件如何,都將為新的變量 a 賦值為 2
而實(shí)際上并不是這樣,應(yīng)該是在函數(shù)內(nèi)部聲明了變量a,而JavaScript引擎在執(zhí)行的時(shí)候,會(huì)把所有變量的聲明都提升到當(dāng)前作用域的最前面,即相當(dāng)于在當(dāng)前函數(shù)作用域的最前端聲明了一個(gè)變量a而沒有給a賦值,此時(shí)a的數(shù)據(jù)類型應(yīng)該為undefined,所以在做if判斷時(shí)a轉(zhuǎn)換成的布爾值應(yīng)該為false,因此!a為true,if語句才得以執(zhí)行,如果將if(!a)改成if(a)則alert(a)將會(huì)為undefined。
var a = 1;
function foo(){
if(a){
var a = 2;
}
alert(a);
}
foo();//undefined
因?yàn)檎娴木庉嬃撕荛L(zhǎng)時(shí)間,寫得我都有點(diǎn)頭昏腦漲了,邏輯有點(diǎn)混亂了,而且實(shí)際上并沒有多少內(nèi)容,希望大家仔細(xì)研究一下原文Scoping & Hosting,歡迎大家一起指正討論學(xué)習(xí)進(jìn)步,謝謝大家