在本文中,我们将通过示例了解Javascript中的块作用域、对块作用域变量的访问,以及它与其他类型变量的作用域的区别。在ES2015之前,JavaScript只支持函数级作用域,不像C++/Java等具有块级作用域的其他语言。在ES2015中,除了功能级别的范围之外,JavaScript还支持在 let关键字 & 常量关键字 .
但在我们详细介绍ES2015之前,让我们先讨论一下“功能级范围”和“块级范围”的确切含义。
区块级范围: 此范围限制在特定块内声明的变量,使其不能被块外的用户访问。这个 允许 & 康斯特 关键字有助于将变量设置为块范围。为了访问特定块的变量,我们需要为它创建一个对象。用 变量 关键字,没有块范围。
例如,考虑下面的例子:
{ let p = 110; const q = 111; } console.log(p); // Uncaught ReferenceError: p is not defined console.log(q); // Uncaught ReferenceError: q is not defined
在这里,我们使用了 允许 & 康斯特 关键字来说明块级别的范围,以便从块外部访问变量。
功能级别范围: 此作用域级别中的变量仅限于访问声明它的函数内部,即,它可以在该函数内部的任何位置访问,而不能在函数外部访问。每次在创建函数时生成一个新的作用域&在该作用域中,该作用域内的任何函数都可以访问任何变量。定义为全局范围的函数或变量将可由所有其他变量或函数访问。现在,让我们看看JavaScript中的函数范围。
function printIfGFG( text){ if(text=="GeeksforGeeks"|| text=="GFG") { var message = "Verified Geek"; console.log(message); // Output: Verified Geek } console.log(message); // Output: Verified Geek } printIfGFG("GFG");
在上面的代码片段中,我们声明并定义了一个变量 消息 内部 如果条件 .然后,使用 慰问。日志() 作用 .
棘手的是,我们还可以打印变量的值 消息 “在if条件之外。这是因为在使用关键字’ 变量 “要有功能范围,, 默认情况下 .JavaScript运行时查找与变量声明相关的最近的封闭函数,并将其设置为该变量的作用域。
但是,JavaScript运行时是如何做到这一点的呢?这里值得一提的是,JavaScript运行时会在内部更改我们的代码,并将所有变量声明移动到函数的开头。这被称为 变量提升 .因此,我们在当前示例中的代码实际上更改为下面的代码片段。
function printIfGFG( text){ var message; if(text=="GeeksforGeeks"|| text=="GFG") { message = "Verified Geek"; console.log(message); // Output: Verified Geek } console.log(message); // Output: Verified Geek } printIfGFG("GFG");
要深入了解ES2015之前JavaScript中变量作用域的概念,请参阅 理解JavaScript中的变量作用域 更多细节请参阅本文。
现在,当我们清楚什么是函数作用域和块作用域时,让我们看看ES2015是如何在JavaScript中实现块作用域的。从ES2015开始,除了关键字 变量 ,两个新关键字可用于声明变量。
让我们: 使用“let”关键字声明的变量与使用“var”关键字声明的变量类似,只有一个区别。使用“let”声明的变量将具有块作用域,并且不会被提升到函数的开头。所以,如果我们试图访问块范围之外的变量,我们会得到一个引用错误,表示变量未定义。
function printIfGFG( text){ if(text=="GeeksforGeeks"|| text=="GFG") { let message = "Verified Geek"; console.log(message); // Output: Verified Geek } console.log(message); // Output: Uncaught ReferenceError: message is not defined } printIfGFG("GFG");
此外,使用“let”关键字声明的变量可以重新定义,但不能重新声明。
let msg = "Try again"; msg = "Try again later"; // Output: Try again later
let msg = "Try again"; let msg = "Try again later"; // Output: Uncaught SyntaxError: Identifier 'msg' has already been declared
康斯特: 使用“Const”关键字声明的变量与使用“let”关键字声明的变量类似,具有一个附加功能,一旦声明和定义,其值就不能更改。
JavaScript中的常量变量是一个常量或固定值不变的变量,即在整个程序中不变。一旦声明,就不可能对其值进行任何形式的修改。如果程序员试图修改它的值,编译器会显示一个错误,这是因为一旦我们将一个变量声明为常量,它就会告诉编译器这是一个固定值,应该防止对它进行任何更改。
常量变量的主要用途是生成只读常量,如
const PI = 3.14 const MAX_USERS = 1000;
此外,还必须定义 康斯特 声明时的变量本身。
const pi; // Syntax Error pi = 3.14
所以在本教程中,我们研究了两个新的关键字,它们可以用来在JavaScript中声明变量。一旦您在声明变量时开始使用这些关键字,就会出现需要再次使用“var”关键字的罕见情况。