JavaScript 中的局部变量和全局变量
我见过很多这样的事情,所以尽管我会在JavaScript变量范围内整理一个快速课程。JavaScript中的局部变量和全局变量之间存在一些重要差异,如果您不知道发生了什么,这会导致白发。
作用域决定了代码可以看到哪些变量。如果在函数内部创建了一个变量,那么它可以说是本地的,因为只有本地运行的代码才能看到它。可以被代码的任何部分访问的变量称为全局变量。这在JavaScript中很特别,我稍后会谈到。
这个作用域概念很重要,就好像一个变量在当前作用域之外,那么代码就看不到它。JavaScript中的一切都是变量,因此了解如何以及何时可以访问变量很重要。
要在JavaScript中创建局部变量,请执行以下操作:
这里要注意的一件事是,如果您在全局空间中(即在函数作用域之外)创建变量,那么它将是全局的。如果此代码在函数内运行,则创建的变量将是该函数的本地变量。
要在JavaScript中创建全局变量,请执行以下操作:
无论在何处创建,此变量将始终是全局的。
这里非常重要的一点是,当JavaScript遇到全局变量声明时,它会向上遍历浏览器对象模型(BOM)树,以查看是否设置了任何具有相同名称的变量。如果有,那么它会使用此处定义的变量覆盖该变量。即使在函数范围内以这种方式定义变量,也会发生这种情况。
通过运行以下命令试一试:
运行此代码时您可能会发现奇怪的一件事是,第一次尝试打印runMe2()中的“变量”变量会产生“未定义”响应。然而,这确实有道理。发生这种情况是因为JavaScript知道稍后将在此函数中创建该变量,因此不会引入同名的全局范围变量。
那么为什么这很重要呢?假设您包含了一个具有名为“a”的变量的框架或第三方脚本。这可能看起来很牵强,但这种事情在JavaScript缩小和闭包编译器的世界中很常见。一切都会正常工作,直到您尝试在您自己的代码中定义一个名为“a”的全局变量,并为其分配一个值来改变所包含代码的工作方式。这类问题真的很难追查,尤其是在缩小代码中。如果您创建一个名为'a'的局部变量,那么它将具有局部作用域(即在当前函数调用中)并且不会破坏全局变量。
那么,底线?将变量定义为本地变量(如在“varvariable;”中)是一种很好的做法,这样它们就不会破坏范围内的任何其他东西。这样做是理所当然的,可以防止将来发生全局变量的任何代码中断。