js作用域

一.程序中的一段源代碼在執(zhí)行前都會(huì)編譯
為以下三個(gè)步驟;
~~~~1.分詞/詞法分析
~~~~~~就是把語(yǔ)句拆分成單個(gè)單個(gè)的詞法單元。[ var , a ,= , 2, ;] 判斷它們是否具有意義。

[' var ', ' a' ,' = ' , '2 ', ';']

~~~~2.解析/語(yǔ)法分析
~~~~~~將詞法單元(數(shù)組)轉(zhuǎn)換成由元素逐級(jí)嵌套的AST(程序語(yǔ)法結(jié)構(gòu)的樹)。

AST.png

~~~~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í),向外層查找。

嵌套作用域.png

三.函數(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ò)。

五.提升

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 2,314評(píng)論 0 21
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 5,622評(píng)論 16 88
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 2,408評(píng)論 0 11
  • 什么是作用域 對(duì)變量值的存儲(chǔ)、訪問、修改帶給程序狀態(tài)的改變編程語(yǔ)言的基本功能之一是能夠存儲(chǔ)變量當(dāng)中的值,在之后對(duì)這...
    JunChow520閱讀 647評(píng)論 0 7
  • 一、理解js作用域 1、作用域:作用域是一套規(guī)則,用于確定在何處以及如何查找變量(標(biāo)字符)。2、LHS查詢:查找的...
    懷念不能閱讀 475評(píng)論 0 1