举例说明说明JavaScript中变量的范围和悬挂

106 阅读5分钟

在JavaScript程序中,一个变量的范围定义了一个变量可以被访问到多远,而在JavaScript中的提升是一种现象,通过这种现象,你甚至可以在变量初始化之前访问它们。

JavaScript中的变量范围

在深入研究变量的范围之前,我们首先要了解什么是JavaScript中的变量以及如何创建一个变量。

变量作为一个容器,可以容纳一些数据。这些变量可以用 "var"、"let "和 "const "三个不同的关键字来创建。

在JavaScript中,一个变量有两种范围,我们将通过一些例子来讨论它们。

JavaScript中的块范围

早期的JavaScript并不支持块范围,但在ES6发布后,它支持了。ES6引入了几个新的关键字,如let和const,这些关键字在JavaScript中提供了块作用力。

块范围在JavaScript中是由大括号"{}"表示的,它决定了在块范围内声明的任何变量都不能在块范围之外被访问。在块内初始化的变量被称为局部变量。

现在我们将了解在块范围内声明的变量的工作。

用 "var "关键字声明的变量不支持块范围,这意味着我们也可以从块外访问该变量。考虑下面的例子,变量是用 "var "关键字声明的,并观察它是如何工作的。

if(true)
{
var a = 100;
console.log("variable inside the block scope : " , a);
}

我们使用关键字 "var "在块内创建了一个变量,并将其赋值为'100'。当我们在块内访问该变量时,它将显示以下输出。

把上面的例子再加强一点,在块的外面访问'a'变量。

if(true)
{
var a = 100;
console.log("variable inside the block scope : " , a);
}
console.log("variable outside the block scope : " , a);

现在观察输出

该输出验证了关键字 "var "不能有块的范围。

现在用 "let "和 "const "关键字创建变量,并尝试从块范围之外访问它们。

if(true)
{
let a = 100;
const b = 150;
console.log("let inside the block scope : " , a);
console.log("const inside the block scope : " , b);
}
console.log("let outside the block scope : " , a);
console.log("const outside the block scope : " , b);

现在从区块内部和外部访问这两个变量。

输出将验证这些变量在块的范围内是可以访问的,但当我们试图从块的范围外访问它们时,就会发生错误 "Uncaught ReferenceError"。

JavaScript中的全局范围

可以从函数/块外部或内部的任何地方访问的变量,被称为全局范围变量。无论它们是在函数/块外还是在函数或块内创建的,即在块内用 "var "关键字创建的变量都可以从JavaScript代码的任何地方访问。

在JavaScript中,如果一个变量没有被正确声明,那么默认情况下,它将被创建在全局范围内。

请看下面的例子,观察全局变量是如何工作的。

var a=100;
let b=120;
const c=250;
if (true)
{
    console.log("global variable : ", a);
    console.log("global variable : ", b);
    console.log("global variable : ", c);
}

在这个例子中,我们全局地声明了变量,并在if语句块中访问它们。

输出结果验证了我们可以在程序的任何地方访问全局定义的变量。

JavaScript中的吊装。

提升指的是一种将变量声明移到顶部的现象。

在这里,我们需要理解变量声明和变量初始化之间的区别,例如,"var a",是一个变量声明,而 "a= 10 "是变量初始化。现在我们将举一个例子来理解我们是如何写代码的,以及JavaScript是如何解释这些代码的。

var a=10;
document.write(a);
var b=20;

JavaScript会把它读成

var a;
var b;
a=10;
document.write(a);
b=20;

JavaScript将声明部分移到最上面,而初始化部分仍然在其位置。

到目前为止,在所有的例子中,我们创建了一个变量并给它分配了一些值,然后我们在最后访问这个变量。如果我们试图在初始化/声明之前访问任何一个变量,怎么办?那么,在这种情况下,JavaScript会显示一个未定义的值,就像在下面的例子中那样。

console.log("Access before declaration : ", a);
var a = 45;

在这个例子中,我们试图在变量 "a "的声明之前打印它的值,然后在下一条语句中,我们创建了这个变量并给它赋值。成功执行后,我们将得到以下输出。

发生这种情况是因为,甚至在执行这段代码之前,JavaScript就给 "var a"分配了一个未定义的值,然后它读取 "console.log(a)",然后 "a=45",因此它显示未定义,而不是45。

而跳过关键字 "var "意味着我们没有声明一个变量,而只是初始化一个变量。在这种情况下,如果我们试图在变量声明之前访问它,我们将面临一个RefferenceError,就像我们在下面的例子中所做的。

console.log("Access before declaration : ", a);
a = 45;

我们尝试在声明前将 "a "的值打印在控制台,然后在下一条语句中为变量 "a "赋值,但没有使用关键词 "var"。

我们得到以下输出

结论

在JavaScript中,变量的范围决定了你可以在代码中访问变量的位置,而变量的提升是指在程序的顶部调用变量的声明的概念。本文提供了一些切中要害的例子来理解JavaScript中变量的范围和提升的概念。