javascript中变量阴影的一个例子

时间:2012-08-10 12:12:01

标签: javascript shadowing

我在Eloquent Javascript (Chapter 3)中了解了变量阴影这个术语,但我试图理解这个概念的一个精确的基本例子。

这是阴影的一个例子吗?

var currencySymbol = "$";

function showMoney(amount) {
  var currencySymbol = "€";
  document.write(currencySymbol + amount);
}

showMoney("100");​

5 个答案:

答案 0 :(得分:26)

这也就是所谓的变量范围

变量仅存在于其包含的函数/方法/类中,并且这些变量将覆盖属于更宽范围的任何变量。

这就是为什么在您的示例中,将显示欧元符号,而不是美元。 (因为包含美元的currencySymbol比包含欧元符号的currencySymbol更宽(全局)范围。)

至于你的具体问题:是的,这是变量阴影的一个很好的例子。

答案 1 :(得分:15)

  

在计算机编程中,当在特定范围内声明的变量(决策块,方法或内部类)与在外部范围内声明的变量具有相同的名称时,会发生变量阴影。这个外部变量据说是阴影......

所以我相信你的榜样很好。

您有一个全局命名变量,它与内部方法共享同一个名称。内部变量将仅用于该函数。没有该变量声明的其他函数将使用全局函数。

答案 2 :(得分:7)

是的,你的例子是阴影的一个例子。

由于JavaScript中的闭包效果,阴影将在其他场景中持续存在。这是一个例子:

var x = -1;
function xCounter() {
    var x = 0;
    return function() {
        ++x;
        return x;
    };
}

console.log(x);   // -1
counter = xCounter();
console.log(counter());   // 1
console.log(counter());   // 2
console.log(x);   // still -1, global was never touched

请注意,在这种情况下,即使xCounter返回,它返回的函数仍然具有对其自己的x的引用,并且该内部函数的调用对全局没有影响,即使原始函数已经很久超出了范围。

答案 3 :(得分:1)

我们不能多次定义一个变量。但是我们可以定义不同的范围。

let name="tara"
if(true){
  let name="ali"
  if(true){
    console.log(name)
  }
}

变量阴影是指局部作用域中的变量使用其值而不是父作用域中的变量的情况,因此局部变量值在父项上具有阴影。

在上面的代码中,定义了两个名称变量,但是它们不在同一范围内定义。因此,如果console.log(name)找到了使用它的名称变量,它将检查本地作用域;如果没有,它会检查父作用域,一旦找到它,它将使用该变量,因此它不会成为根。

答案 4 :(得分:0)

var role = "Engineer";
console.log(role);

function displayRole(){
    role = "developer";
    console.log(role);
}

displayRole();
console.log(role);

请注意,最后一行代码(console.log)如何显示developer,但不在函数范围内。这是shadowing的一个很好的示例,其中全局作用域中的角色变量已被函数作用域中的角色覆盖。

为避免阴影,应使用var关键字声明函数作用域中的变量,以便仅该函数可以访问它。