03.06 「前端架構師30天快速掌握js16」之作用域知識點詳解

此篇文章講解目錄:

  • 作用域詳解

  • 基本的變量作用域

  • “無塊級作用域”的理解

  • 作用域鏈

作用域的詳解

在深入學習JavaScript作用域之前,首先要了解一下,究竟什麼是作用域。幾乎所有的編程語言都有作用域的概念,簡單的說,作用域就是變量與函數的可訪問範圍,即作用域控制著變量與函數的可見性和生命週期。

我們先了解一下JavaScript的工作原理,引擎,編譯器,作用域三者是如何協同工作來完成javascript代碼的執行的。

引擎:從頭到尾負責整個JavaScript程序的編譯及執行過程。

編譯器:負責詞法分析及代碼生成

作用域:負責收集並維護由所有聲明的變量組成的一系列查詢,並實施一套非常嚴格的規則,確定當前執行的代碼對這些變量的訪問權限。

基本的變量作用域

「前端架構師30天快速掌握js16」之作用域知識點詳解

上面的例子中,聲明瞭全局變量 scope 和函數體內的局部變量 scope。在函數體內部,局部變量的優先級比通明的全局變量要高,如果一個局部變量的名字與一個全局變量相同,那麼,在聲明局部變量的函數體範圍內,局部變量將覆蓋同名的全局變量。

「前端架構師30天快速掌握js16」之作用域知識點詳解

在上面的例子中,為什麼函數體外面的scope也變成了local呢,這是因為javascript的特性造成的。在全局作用域中聲明變量可以省略 var 關鍵字,但是如果在函數體內聲明變量時不使用 var 關鍵字,就會發生上面的現象。首先,函數體內的第一行語句,把全局變量中的 scope 變量的值改變了。而在聲明 myScope 變量時,由於沒有使用 var 關鍵字,Javascript 就會在全局範圍內聲明這個變量。因此,在聲明局部變量時使用 var 關鍵字是個很好的習慣。

“無塊級作用域”

在 C 或者 Java 等語言中,if、for 等語句塊內可以包含自己的局部變量,這些變量的作用域是這些語句的語句塊,而在 Javascript 中,不存在「塊級作用域」的說法。

「前端架構師30天快速掌握js16」之作用域知識點詳解

在上面的例子中,無論在函數的if或者for語句內外,i k j這些變量都可以正常輸出,說明:函數中聲明的所有變量,無論是在哪裡聲明的,在整個函數中它們都是有定義的,即使是在聲明之前

作用域鏈

由於JavaScript中的每個函數作為一個作用域,如果出現函數嵌套函數,則就會出現作用域鏈。

「前端架構師30天快速掌握js16」之作用域知識點詳解

上述代碼中,當執行console.log(xo)時,其尋找順序為根據作用域鏈從內到外的優先級尋找,如果內層沒有就逐步向上找,直到沒找到拋出異常。

「前端架構師30天快速掌握js16」之作用域知識點詳解

下面這張圖,則更加形象的說明了作用域鏈的解釋:

「前端架構師30天快速掌握js16」之作用域知識點詳解

大家好接下來我們會邀請前端架構師以連載的方式,通過30天的實戰系統講解JavaScript的專業知識,歡迎大家關注頭條號“互聯網IT信息”。


分享到:


相關文章: