在阅读a JavaScript article时,我遇到了这个术语“影子识别器声明”。有人能解释一下这是什么吗?如果可能的话,请提供一个简单的例子。
答案 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
// ...
}
有几种方法可能会影响某些事情:
使用变量声明(var
,let
,const
),如上所述
使用参数声明:
var foo; // The outer one
function example(foo) { // This parameter shadows the outer `foo`
// ...
}
使用函数声明:
var foo; // The outer one
function example() {
function foo() { // This shadows the outer `foo`
}
// ...
}
......还有其他几个人。在范围内声明标识符的任何内容,该标识符隐藏(阴影)包含范围中的标识符,这是一个阴影声明/定义。
答案 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)