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教程: