讀懂預(yù)編譯珠移,不怕作用域面試題

我還記得之前很長一段時間被各種作用域面試題支配的恐懼(弱小無助.png)
現(xiàn)在不怕啦弓乙,讀懂作用域先理解預(yù)編譯。
來道簡單題先:

var a="aa";
function test(){
  console.log(a);
 var a="bb";
   console.log(a);
}
test();
console.log(a);

答案:undefined bb aa

幾個概念解釋下:

預(yù)編譯

javascript是解釋性語言剑梳,主要特點為解釋一行執(zhí)行一行唆貌。而在js運行時會進行三件事:
1語法分析
2.預(yù)編譯
3.解釋執(zhí)行
語法分析會在代碼執(zhí)行前對代碼進行通篇檢查,以排除一些低級錯誤垢乙,預(yù)編譯發(fā)生在代碼執(zhí)行的前一刻锨咙。所以,函數(shù)在執(zhí)行時已經(jīng)預(yù)編譯過了追逮。

頁面在創(chuàng)建之初就創(chuàng)建了GO(global object)對象酪刀,即window對象,所以全局變量也可以叫做window的屬性钮孵。
1骂倘、查找變量,作為GO屬性巴席,并賦值undefined历涝。
2、查找函數(shù)聲明體,作為GO屬性荧库,并賦值函數(shù)體堰塌。

預(yù)編譯做了些什么事情

1、查看語法錯誤分衫,如果有錯誤就不執(zhí)行接下來的代碼场刑。
2、發(fā)現(xiàn)有調(diào)用函數(shù)時蚪战,創(chuàng)建AO(activation object)對象牵现。
3、查找形參和變量聲明邀桑,將變量和形參名作為AO屬性名瞎疼,值為undefined
4、將實參值和形參統(tǒng)一
5概漱、在函數(shù)體里面找函數(shù)聲明丑慎,值賦予函數(shù)體

現(xiàn)在回到剛才的那道題:
1、創(chuàng)建了GO對象

GO{
   a:undefined, //查找變量瓤摧,作為GO屬性竿裂,并賦值undefined
   test:fun, //查找函數(shù)聲明體,作為GO屬性照弥,并賦值函數(shù)體
}

2腻异、執(zhí)行js

GO{
    a:"aa",  //變量a已存在,賦值‘a(chǎn)a’
    test:fun, 
}

3这揣、讀到函數(shù)調(diào)用悔常,創(chuàng)建test函數(shù)的AO對象

AO{
    a:undefined, //查找變量,作為AO屬性给赞,賦值undefined
}

4机打、執(zhí)行test 函數(shù)

console.log(a) //undefined

此時有2個同名為a的變量,這里涉及到作用域鏈[[scope]]的概念片迅,但是只要記住残邀,自己有的用自己的,沒有的再向父級尋找柑蛇。
此時芥挣,test函數(shù)AO對象內(nèi)有a,且值為undefined耻台,所以打印出來為undefined,

AO{
    a:“bb”, //var a = 'bb'給a賦值
}

5空免、函數(shù)執(zhí)行完畢

console.log(a); // ‘bb’此時的a為全局變量a,父級不能訪問子級的私有變量

再來幾道題盆耽,大家可以把答案寫在下面:

var fn
function fn(a){
    console.log(a);
    var a = 123;
    console.log(a);
    function a(){}
    console.log(a);
    var b = function (){}
    console.log(b);
    function d(){}
}
fn(1)
console.log(fn)
function test (a,b){
    console.log(a)
    c = 0;
    var c;
    a = 3;
    b =2;
    console.log(b);
    function b() {}
    function d() {}
    console.log(b)
}
test(1)
console.log(test);
function test(test){
    console.log(test);
    var test = 123
    console.log(test)
    function test (){}
}
test(1);
var test = 123

沒有聲明的變量賦值蹋砚,默認(rèn)為全局變量扼菠,不管在哪里都默認(rèn)為全局變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末都弹,一起剝皮案震驚了整個濱河市娇豫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畅厢,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮昧,死亡現(xiàn)場離奇詭異框杜,居然都是意外死亡,警方通過查閱死者的電腦和手機袖肥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門咪辱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椎组,你說我怎么就攤上這事油狂。” “怎么了寸癌?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵专筷,是天一觀的道長。 經(jīng)常有香客問我蒸苇,道長磷蛹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任溪烤,我火速辦了婚禮味咳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檬嘀。我一直安慰自己槽驶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布鸳兽。 她就那樣靜靜地躺著掂铐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贸铜。 梳的紋絲不亂的頭發(fā)上堡纬,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音蒿秦,去河邊找鬼烤镐。 笑死,一個胖子當(dāng)著我的面吹牛棍鳖,可吹牛的內(nèi)容都是我干的炮叶。 我是一名探鬼主播碗旅,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镜悉!你這毒婦竟也來了祟辟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤侣肄,失蹤者是張志新(化名)和其女友劉穎旧困,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稼锅,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吼具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矩距。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拗盒。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锥债,靈堂內(nèi)的尸體忽然破棺而出陡蝇,到底是詐尸還是另有隱情,我是刑警寧澤哮肚,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布登夫,位于F島的核電站,受9級特大地震影響绽左,放射性物質(zhì)發(fā)生泄漏悼嫉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一拼窥、第九天 我趴在偏房一處隱蔽的房頂上張望戏蔑。 院中可真熱鬧,春花似錦鲁纠、人聲如沸总棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽情龄。三九已至,卻和暖如春捍壤,著一層夾襖步出監(jiān)牢的瞬間骤视,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工鹃觉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留专酗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓盗扇,卻偏偏與公主長得像祷肯,于是被迫代替她去往敵國和親沉填。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351