JavaScript範圍

了解JavaScript範圍的基礎

作用域是用編程語言定義的一組規則,用於確定變量的值。

JavaScript用途詞彙範圍,這意味著變量的值由寫入時的位置定義。不是在調用它時發生的,而是其他情況發生的情況,動態範圍

範圍是程序的一部分可見的一組變量。

我們有一個全局範圍,塊範圍和功能範圍。如果在函數或塊之外定義了變量,則該變量將附加到全局對象,並且具有全局作用域,這意味著該變量可在程序的每個部分中使用。

兩者之間有一個非常重要的區別varletconst聲明。

定義為的變量var在函數內部僅在該函數內部可見。就像函數參數一樣。

定義為的變量const或者let另一方面,它僅在其所在的那個區塊內可見。

重要的是要理解一個塊(由一對花括號標識)不會為以下內容定義新的作用域var,但確實letconst。的新範圍var僅在創建函數時創建,因為var沒有塊範圍,但有功能範圍。

在函數內部,任何var即使在函數的末尾聲明了變量,在其中定義的變量在所有函數代碼中都是可見的,因為仍然可以在開始時引用它,因為JavaScript實際上是在執行代碼之前將所有變量聲明移到頂部(稱為吊裝)。為避免混淆,請務必聲明var函數開頭的變量。

這就是我的意思。即使您聲明了var變量在函數末尾,其聲明移至頂部:

function run() {
  console.log(`${name}`)
  var name = 'Flavio'
}

run()

這將顯示“ undefined”,因為實際發生的是:

function run() {
  var name;
  console.log(`${name}`)
  name = 'Flavio'
}

run()

letconst不要“受苦”吊裝。如果在上面的示例中使用其中之一,則會出現錯誤:ReferenceError: name is not defined

在JavaScript中,父函數的變量也可用於內部函數。內部函數的範圍還包括父函數的範圍,這稱為閉包(稍後將對此進行更廣泛的討論)。

您需要注意一件事。在非嚴格模式下,如果在未聲明的情況下使用變量,則無論在何處執行該變量,該變量都將附加到全局範圍。這可能是錯誤的錯誤來源。因此,請確保在使用變量之前始終聲明它們。請注意這一點,但這是默認情況下使用嚴格模式的另一個原因,它可以解決此問題。稍後我們將討論嚴格模式。

請記住:在函數(或塊)中定義的名稱與全局變量相同的任何變量都將優先於全局變量,並對其進行陰影處理。

此打印undefined

var name = 'Roger'

function run() { console.log(</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">name</span><span style="color:#e6db74">}</span><span style="color:#e6db74">) var name = ‘Flavio’ }

run()

這會引發一個錯誤ReferenceError: name is not defined

let name = 'Roger'

function run() { console.log(</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">name</span><span style="color:#e6db74">}</span><span style="color:#e6db74">) let name = ‘Flavio’ }

run()

免費下載我的JavaScript初學者手冊


更多js教程: