關於JavaScript的作用域你應該瞭解的那點事!

千鋒武漢發表於2021-06-28

      作用域是JavaScript中非常基礎的概念,很多剛入門的同學卻弄不懂作用域的概念,但不弄明白的話又不能夠寫出高效簡介的程式碼,今天小千就來給大家介紹一下關於前端JavaScript作用域的那點事。

web前端培訓

      什麼是作用域

      JavaScript 中的作用域是指變數的可訪問性或可見性,也就是說,程式的哪些部分可以訪問該變數,或者該變數在何處可見。

      為什麼作用域很重要

      作用域的主要好處是安全性。也就是說,只能從程式的特定區域訪問變數,使用作用域,我們可以避免程式其他部分對變數的意外修改。

      作用域可減少命名衝突。也就是說,我們可以在不同的作用域內使用相同的變數名。

      作用域型別

      JavaScript中有三種型別的作用域:全域性作用域、區域性作用域或函式作用域、塊級作用域。

      1. 全域性作用域

      不在函式或塊(一對花括號)內定義的任何變數都在全域性作用域內,可以從程式的任何位置訪問全域性作用域內的變數。例如:

全域性作用域

      2. 區域性作用域或函式作用域

      利用 var 在函式體內部宣告的變數都在區域性作用域(或稱函式作用域)內,它們只能從該函式內部訪問,不能在外部程式碼中訪問。例如:

區域性作用域web前端培訓

      3. 塊級作用域

      ECMAScript 2015 引入了 let 和 const 來定義變數,與 var 定義變數不同,它們的作用域是在最接近的花括號內,這意味著,不能從那對花括號之外訪問它們。例如:

      我們可以看到 var 定義的變數可以在塊外部使用,而 let 定義的變數不能在塊外部訪問。

塊級作用域web前端培訓

      4.巢狀作用域

      就像 JavaScript 中的函式一樣,一個作用域可以巢狀在另一個作用域內。例如:

巢狀作用域web前端培訓

      這個程式碼片段中有 3 個作用域彼此巢狀。首先,塊級作用域(由 let 定義的變數建立)巢狀在區域性作用域或函式作用域內,而後者又巢狀在全域性作用域內。

      5.詞法作用域

      詞法作用域(也稱為靜態作用域),從字面上講是指作用域是在詞法分析(通常稱為編譯)時確定的,而不是在執行時確定的。以題主的問題作為示例:

詞法作用域

      在這裡,不管是從哪兒呼叫 test() 函式,console.log(a) 總是會列印 hello world,這與具有 動態作用域 的語言 console.log(a) 不同,後者會根據呼叫函式的位置而列印不同的值。

      如果上面的程式碼是用支援動態作用域的語言編寫的,console.log(a) 則會列印出來 I belong to func。

      使用詞法作用域,我們可以僅透過檢視原始碼來確定變數的作用域,而在動態作用域下,只有在執行程式碼後才能確定作用域。

      6.作用域鏈

      當在 JavaScript 中使用變數時,JavaScript 引擎將嘗試在當前作用域中查詢變數的值,如果找不到變數,它將查詢外部作用域並將繼續這樣做,直到找到變數或到達全域性作用域為止。如果在全域性作用域中仍然找不到該變數,它將在全域性作用域內隱式宣告該變數(非嚴格模式下)或返回錯誤。

作用域鏈web前端培訓

      呼叫 bar() 函式時,JavaScript 引擎將查詢 bar 變數並在當前作用域中找到了它。接下來,在當前作用域中查詢 foo 變數,但無法找到它,因此繼續在外部作用域中查詢並找到了它(即全域性作用域)。

      之後,我們為 num 變數賦值 99,JavaScript 引擎在當前作用域中查詢 num 變數,找不到,然後在外部作用域(全域性作用域)中查詢變數,也找不到,由於指令碼不在嚴格模式下,因此建立一個名為 num 的新全域性變數,併為其分配變數值 99。

      以上就是關於JavaScript作用域的介紹和案例了,希望能幫到大家。本文來自千鋒教育,轉載請註明出處。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2778631/,如需轉載,請註明出處,否則將追究法律責任。

相關文章