我在Eloquent Javascript(第 3 章)中了解了术语变量阴影,但我试图理解该概念的一个精确的基本示例。
这是阴影的一个例子吗?
var currencySymbol = "$";
function showMoney(amount) {
var currencySymbol = "€";
console.log(currencySymbol + amount);
}
showMoney("100");
我在Eloquent Javascript(第 3 章)中了解了术语变量阴影,但我试图理解该概念的一个精确的基本示例。
这是阴影的一个例子吗?
var currencySymbol = "$";
function showMoney(amount) {
var currencySymbol = "€";
console.log(currencySymbol + amount);
}
showMoney("100");
这也就是所谓的变量范围。
一个变量只存在于其包含的函数/方法/类中,这些将覆盖属于更广泛范围的任何变量。
这就是为什么在您的示例中,将显示欧元符号,而不是美元。(因为currencySymbol
包含美元的范围比currencySymbol
包含欧元符号的范围更广)。
至于你的具体问题:是的,这是变量阴影的一个很好的例子。
在计算机编程中,当在特定范围(决策块、方法或内部类)内声明的变量与在外部范围内声明的变量具有相同名称时,就会发生变量影子。据说这个外部变量是隐藏的......
所以我相信你的例子很好。
您有一个与内部方法同名的全局命名变量。内部变量将仅在该函数中使用。没有该变量声明的其他函数将使用全局变量。
是的,您的示例是阴影的示例。
由于闭包在 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
并且对该内部函数的调用对全局没有影响,即使原始函数早已超出范围。
我们不能多次定义一个变量。但是我们可以在不同的范围内定义。
let name="tara"
if(true){
let name="ali"
if(true){
console.log(name)
}
}
变量遮蔽是当局部作用域中的变量使用其值而不是父作用域中的变量时。所以局部变量值遮蔽了父作用域。
在上面的代码中定义了两个名称变量,但它们没有定义在同一个范围内。所以 console.log(name) 将检查本地范围,如果它找到它使用的名称变量,如果没有,它会在找到它后检查父范围,它使用那个,所以它不会进入根。
var role = "Engineer";
console.log(role);
function displayRole(){
role = "developer";
console.log(role);
}
displayRole();
console.log(role);
注意最后一行代码 (console.log) 如何打印developer
但它不在函数范围内。这是shadowing
全局作用域中的角色变量被函数作用域中的角色覆盖的一个很好的例子。
为了避免阴影,函数作用域中的变量应该使用 var 关键字声明,以便它只能被函数访问。