一.程序中的一段源代碼在執(zhí)行前都會(huì)編譯
為以下三個(gè)步驟;
1.分詞/詞法分析
就是把語(yǔ)句拆分成單個(gè)單個(gè)的詞法單元。[ var , a ,= , 2, ;] 判斷它們是否具有意義。
[' var ', ' a' ,' = ' , '2 ', ';']
2.解析/語(yǔ)法分析
將詞法單元(數(shù)組)轉(zhuǎn)換成由元素逐級(jí)嵌套的AST(程序語(yǔ)法結(jié)構(gòu)的樹)。
3.代碼生成
將AST轉(zhuǎn)化成可執(zhí)行代碼(機(jī)器指令)。
二.理解作用域
1.引擎
js編譯以及執(zhí)行過程。
2.編譯器(一)
3.作用域
收集并維護(hù)標(biāo)識(shí)(變量),確定其訪問權(quán)限。
4.作用域嵌套
當(dāng)一個(gè)作用域嵌套在另一個(gè)塊或函數(shù)中,就產(chǎn)生了作用域嵌套。
在當(dāng)前作用域無法找到某變量時(shí),向外層查找。
三.函數(shù)作用域
函數(shù)作用域是指屬于這個(gè)函數(shù)的全部變量 都可以在整個(gè)函數(shù)的范圍內(nèi)使用及復(fù)用。
在函數(shù)外部調(diào)用。被調(diào)用函數(shù)一定為具名函數(shù),而用函數(shù)名調(diào)用函數(shù)這種方法就污染了作用域。使用IIFE函數(shù)解決了這個(gè)問題。在調(diào)用外部js時(shí)所得沙箱模式就是IIFE,不污染外部環(huán)境。
四.塊作用域
塊作用域的用處:變量的聲明應(yīng)該距離使用的地方越近越好。并最大限度的本地化。避免污染。
1.let
let聲明的變量可以將變量綁定到所在的任意作用域中。({ .. }內(nèi)部)
使用let聲明的變量不會(huì)被提升。(如下代碼)
{
console.log(bar); // ReferenceError
let bar = 2; //此處不會(huì)被提升。
}
for循環(huán)中的let將i綁定到了每一個(gè)迭代中。
2.const
固定常量,不可被修改,否則報(bào)錯(cuò)。
五.提升