📜  JavaScript 中的变量阴影

📅  最后修改于: 2022-05-13 01:56:26.198000             🧑  作者: Mango

JavaScript 中的变量阴影

块作用域:要理解 JavaScript 中的阴影,我们首先需要明确作用域。在计算机编程语言中,作用域是程序的某个部分/区域,其中定义的变量可以存在并且可以被识别,除此之外它不能被访问。在 JavaScript 中,是由花括号 {} 定义的复合语句,用于将多个语句组合成一个语句,而 JavaScript 只需要一个语句。并且可以在块内访问的所有变量和函数都被称为在该块范围内,因此称为块范围。

例如, letconst变量存储在不同的内存空间中,因此称为块作用域,但var变量存储在全局对象内存空间中,因此可以在块外访问,因此称为全局作用域。

Shadowing:现在,当在某个范围内声明一个变量时,在其外部范围内定义了相同的名称,并且当我们从内部范围内调用该变量时,分配给内部范围内变量的值就是将要存储的值在内存空间的变量中。这称为阴影或可变阴影。在 JavaScript 中,在 ECMAScript 6 中引入letconst以及块作用域允许变量遮蔽。

例子:

Javascript
function func() {
    let a = 'Geeks';
      
    if (true) {
        let a = 'GeeksforGeeks';  // New value assigned
        console.log(a); 
    }
      
    console.log(a); 
func();


Javascript
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();


输出:

GeeksforGeeks
Geeks

非法遮蔽:现在,在遮蔽变量时,它不应该越过作用域的边界,即我们可以通过let变量遮蔽var变量,但不能反其道而行之。因此,如果我们尝试通过var变量来遮蔽let变量,则称为非法遮蔽,它会给出“变量已定义”的错误。

例子:

Javascript

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

注意:箭头函数也遵循相同的范围和变量阴影规则。