js是運(yùn)行在瀏覽器端的束铭,瀏覽器內(nèi)部眾多功能中有一個(gè)小功能叫做js解析器。
js在解析器在運(yùn)行js代碼時(shí)分為下面兩步:
1厢绝、把所有的 變量契沫、函數(shù)、參數(shù) 提前到當(dāng)前作用域的頂部昔汉。并且所有的變量懈万,參數(shù)都給一個(gè)undefined的值,如果是函數(shù)就給把整個(gè)函數(shù)塊拿過來靶病。如果遇見重名后一個(gè)會(huì)覆蓋前一個(gè)会通,如果變量和函數(shù)重名,函數(shù)覆蓋變量娄周。
2涕侈、逐行執(zhí)行代碼(從上到下,從左到右)
遇到變量煤辨、函數(shù)調(diào)用裳涛、參數(shù) 去預(yù)習(xí)解析里找
//表達(dá)式:= + - * / % ++ -- ! 參數(shù) ...
--遇見表達(dá)式 :表達(dá)式可以修改 預(yù)解析后的值木张。
--遇見函數(shù):再開一個(gè)新的作用域,進(jìn)行的預(yù)解析调违,逐行執(zhí)行代碼窟哺。如果當(dāng)前作用域里的變量沒有帶var,那么就一層一層的向上級(jí)作用域里去找技肩。找不到報(bào)錯(cuò)且轨。
注函數(shù)預(yù)解析:
1?函數(shù)聲明可以被預(yù)解析,所以可以先調(diào)用虚婿,再聲明旋奢。
2?函數(shù)表達(dá)式,不會(huì)被預(yù)解析然痊,所以只能先聲明再調(diào)用至朗,不能把調(diào)用放在聲明的前面(不然就報(bào)錯(cuò))