JavaScript 变量遮蔽
块作用域: 要理解JavaScript中的遮蔽现象,首先我们需要明确作用域的概念。在计算机编程语言中, 作用域 是程序中的某个区域,其中定义的变量可以存在和被识别,但在该区域之外是无法访问的。在JavaScript中, 块 是由花括号{}定义的复合语句,用于将多个语句组合成一个语句,JavaScript只期望一个语句。在一个块内部可以访问的所有变量和函数被称为块作用域,因此被称为 块作用域的。
例如,let和const变量存储在单独的内存空间中,所以被称为块作用域,而var变量可以在块之外访问,因为它存储在全局对象内存空间中,因此被称为 全局作用域的。
遮蔽: 当在特定作用域中声明一个变量,该变量与其外部作用域中的同名变量冲突时,当我们从内部作用域中调用变量时,内部作用域中变量被赋予的值将存储在变量的内存空间中。这被称为 遮蔽或变量遮蔽。 在JavaScript中,let和const在ECMAScript 6中的引入以及块作用域允许变量遮蔽。
示例:
function func() {
let a = 'Geeks';
if (true) {
let a = 'GeeksforGeeks'; // New value assigned
console.log(a);
}
console.log(a);
}
func();
输出:
GeeksforGeeks
Geeks
非法的变量遮蔽: 在遮蔽变量时,它不应穿越作用域的边界,即我们可以用 let 变量来遮蔽 var 变量,但不能反过来。因此,如果我们尝试用 var 变量来遮蔽 let 变量,这将被视为 非法的变量遮蔽 并将显示错误信息“变量已经定义。”
示例:
function func() {
var a = 'Geeks';
let b = 'Geeks';
if (true) {
let a = 'GeeksforGeeks'; // Legal Shadowing
var b = 'Geeks'; // Illegal Shadowing
console.log(a); // It will print 'GeeksforGeeks'
console.log(b); // It will print error
}
}
func();
输出:
Identifier 'b' has already been declared
注意: 箭头函数也遵循相同的作用域和变量遮蔽规则。
极客教程