預(yù)解析:在解析代碼之前做一些處理 預(yù)解析做什么處理? 把變量的聲明提前了----提前到當(dāng)前所在的作用域的最上面 函數(shù)的聲明也會(huì)被提前---提前到當(dāng)前所在的作用域的最上面 那么我們現(xiàn)在開始舉幾個(gè)例子 1、觀察下方的第一個(gè)紅框中的代碼,猜猜它的結(jié)果是什么? ![]() 通過運(yùn)行我們發(fā)現(xiàn),代碼竟然神奇的沒有報(bào)錯(cuò)?但是輸出的也不是下面賦值的1而是undefined,這到底是為什么呢?其實(shí)這就是因?yàn)閖s引擎的預(yù)解析將num這個(gè)變量的聲明提前到作用域的最上方(num是全局變量所以提前到最外層也就是script標(biāo)簽內(nèi)的最上方),導(dǎo)致代碼變成了第二個(gè)紅框中的代碼,所以在輸出num的時(shí)候num還沒有被賦值導(dǎo)致控制臺(tái)輸出undefined。 2、觀察下方的第一個(gè)紅框中的代碼,猜猜它的結(jié)果是什么? ![]() 結(jié)果是undefined,此題要注意的就是輸出語句所在的函數(shù)內(nèi)有一個(gè)與全局變量重名的變量num,此時(shí)要注意局部變量可不會(huì)覆蓋全局變量,局部變量num由于預(yù)解析將聲明放在了其作用域頂部(它的作用域就是函數(shù)f1內(nèi)部所以提前到函數(shù)內(nèi)容頭部),此時(shí)其并沒有賦值所以會(huì)輸出undefined。 3、那么我們吧“var=10”去掉又會(huì)如何呢?觀察下方的第一個(gè)紅框中的代碼,猜猜它的結(jié)果是什么? ![]() 結(jié)果是并不是輸出 20 而是 undefined,你猜對(duì)了么? 那么為什么會(huì)輸出undefined呢?就是因?yàn)閖s引擎會(huì)對(duì)其進(jìn)行預(yù)解析,解析過程就是將變量的聲明(千萬要注意僅僅是聲明并不包括賦值)和函數(shù)聲明提前到作用域的最上方,最終變成第二個(gè)紅框中的代碼。 4、觀察下方的第一個(gè)紅框中的代碼,猜猜它的結(jié)果是什么? ![]() 結(jié)果并不是輸出1和2而是輸出兩次2,原因是經(jīng)過預(yù)解析以后第一個(gè)紅框中的代碼變成了第二個(gè)紅框中的代碼,而且藍(lán)框中的函數(shù)名字和綠框中的函數(shù)名字一模一樣,所以綠框中的函數(shù)會(huì)覆蓋藍(lán)框中的函數(shù)最終導(dǎo)致藍(lán)框中的函數(shù)消失,所以下方兩次調(diào)用的都是綠框中的函數(shù)。怎么樣,這次你猜對(duì)了么? 拓展:注意變量的名字和函數(shù)的名字也不能相同,否則同樣會(huì)發(fā)生覆蓋!示例如下 ![]() 顯然結(jié)果并不是undefined,而是函數(shù)。 5、觀察下方的代碼,猜猜它的結(jié)果是什么? ![]() 結(jié)果是 1 11 2 22 可見兩個(gè)script標(biāo)簽中的代碼并沒有發(fā)生覆蓋。 拓展:經(jīng)過我個(gè)人測試,第二對(duì)script標(biāo)簽中代碼執(zhí)行的規(guī)律是如果第二對(duì)script標(biāo)簽中存在將要使用的變量或函數(shù)那就使用這個(gè)變量和函數(shù),如果不存在那就去第一對(duì)script標(biāo)簽中查找如果存在就拿來使用。 6、觀察下方的第一個(gè)紅框中的代碼,猜猜它的結(jié)果是什么? ![]() 答案是 9 9 9 9 9 報(bào)錯(cuò) 前面預(yù)解析部分沒有什么特殊的,要注意綠框中的代碼,不要想當(dāng)然的認(rèn)為連等賦值全是顯式局部變量,事實(shí)上除了第一個(gè)是顯式局部變量后兩個(gè)都是隱式全局變量。 7、觀察下方的第一個(gè)紅框中的代碼,猜猜它的結(jié)果是什么? ![]() 答案是無法運(yùn)行直接報(bào)錯(cuò),這是因?yàn)轭A(yù)解析把變量聲明提前,而給f1賦值并不會(huì)提前。
|
|