什么是JavaScript中的“影子标识符声明”?

时间:2017-02-11 09:03:18

标签: javascript

在阅读a JavaScript article时,我遇到了这个术语“影子识别器声明”。有人能解释一下这是什么吗?如果可能的话,请提供一个简单的例子。

snapshot from the article

3 个答案:

答案 0 :(得分:7)

当您在隐藏包含范围内的标识符的范围内声明标识符时:

var foo; // The outer one
function example() {
    var foo; // The inner one -- this "shadows" the outer one, making the
             // outer one inaccessible within this function
    // ...
}

有几种方法可能会影响某些事情:

  1. 使用变量声明(varletconst),如上所述

  2. 使用参数声明:

    var foo; // The outer one
    function example(foo) { // This parameter shadows the outer `foo`
        // ...
    }
    
  3. 使用函数声明:

    var foo; // The outer one
    function example() {
        function foo() { // This shadows the outer `foo`
        }
        // ...
    }
    
  4. ......还有其他几个人。在范围内声明标识符的任何内容,该标识符隐藏(阴影)包含范围中的标识符,这是一个阴影声明/定义。

答案 1 :(得分:2)

维基百科定义(https://en.wikipedia.org/wiki/Variable_shadowing):

  

在计算机编程中,变量时会发生变量阴影   在一定范围内宣布(决策块,方法或内部   class)与外部作用域中声明的变量同名。在   标识符的级别(名称,而不是变量),这是已知的   作为名字掩盖。这个外部变量据说是由阴影遮蔽的   内部变量,而内部标识符被称为掩盖外部   标识符。这可能会导致混淆,因为可能不清楚哪一个   变量后续使用的阴影变量名称是指,哪个   取决于语言的名称解析规则。

Java示例:

public class Shadow {
        private int myIntVar = 0;

        public void shadowTheVar(){

            // since it has the same name as above object instance field, it shadows above 
            // field inside this method
            int myIntVar = 5;

            // If we simply refer to 'myIntVar' the one of this method is found 
            // (shadowing a seond one with the same name)
            System.out.println(myIntVar);

            // If we want to refer to the shadowed myIntVar from this class we need to 
            // refer to it like this:
            System.out.println(this.myIntVar);
        }

        public static void main(String[] args){
            new Shadow().shadowTheVar();
        }
    }

答案 2 :(得分:0)

对于您的问题,请考虑此代码

function foo(a) {
var b = 2;
// some code
function bar() {
// ...
}
// more code
var c = 3;
}

当您尝试从全局范围执行时,在此片段中。

bar(); // fails
console.log( a, b, c ); // all 3 fail

如果你有其他代码,比如

,请在函数栏(){....}中假设
function foo(){
var b = 3;
console.log(b);
}

然后它意味着foo linside the bar正在影响全局范围内的foo(a)