我正在尝试理解Javascript如何处理当前作用域的子块中let变量的重新声明。
由let
声明的
变量在为其定义的块以及任何包含的子块中都有其作用域。
如果我们尝试这样做,它会像预期的那样正常工作:
function letTest() {
let x = 1;
for(var i = 0; i < 1; i++) {
console.log(x); // logs - 1
}
}
另一个例子。现在,我使用for
子块为0
的let
变量分配一个新值,并执行for
循环。这也和预期的一样。
function letTest() {
let x = 5;
console.log(x); // logs – 5
for( x = 0; x < 12; x++) {
console.log(x); // logs – 0, 1, 2, 3, 4, 5, 6, … 10, 11
}
console.log(x); // logs - 12
}
但是,当我们在x
子块中使用关键字let
重新声明并为同一变量for
分配新值时,会发生什么情况:
function letTest() {
let x = 5;
console.log(x); // logs – 5
for( let x = 0; x < 12; x++) {
console.log(x); // logs – 1, 2, 3, 4, 5, 6, … 10, 11
}
console.log(x); // logs - 5
}
这里是什么机制在起作用,到底发生了什么?
为什么let x = 5
的值没有改变,为什么现在有2个同名的let
变量?
发布于 2018-08-03 16:05:00
我相信我在这里找到了答案:
Demystifying JavaScript Variable Scope and Hoisting
在JavaScript中,可以在嵌套作用域的多层中指定同名变量。在这种情况下,局部变量优先于全局变量。如果以相同的名称声明局部变量和全局变量,则在函数内使用局部变量时,将优先使用局部变量。这种类型的行为称为遮蔽。简单地说,内部变量遮蔽了外部变量。
这里也是:
https://stackoverflow.com/a/11901489/6375464
在计算机编程中,当某个作用域(决策块、方法或内部类)中声明的变量与外部作用域中声明的变量同名时,就会发生变量隐藏。这个外部变量被认为是被屏蔽的……
发布于 2018-08-03 06:53:44
let语句创建一个块范围变量。
function letTest() {
let x = 5;
console.log(x); // x = 5 (same 'x')
for(let x = 0; x < 12; x++) {
console.log(x); // x = 1, 2, …, 10, 11 (different 'x')
}
console.log(x); // x - 5 (same 'x')
}
而var语句创建一个函数作用域变量。
function varTest() {
var x = 5;
console.log(x); // x = 5
for(var x = 0; x < 12; x++) {
console.log(x); // x = 1, 2, …, 10, 11
}
console.log(x); // x = 12 ('x' from the for-loop)
}
发布于 2018-08-03 08:14:48
我删除了我之前的答案,因为我误解了你的问题。
尝试在浏览器中运行以下功能(最好是chrome dev工具):
function letTest() {
debugger;
for(var i=0; i<2; i++) {
//some code here
}
}
在调试器步骤中,var将显示为'i=undefined‘,即使它最初是在for循环中定义的。这是因为它的作用域是执行上下文,在本例中是函数letTest。由于它在这里可用,因此在for-loop块之后也将可用。
function letTest() {
debugger;
for(let i=0; i<2; i++) {
//some code here
}
}
在调试器步骤中,i不可用,因为它的作用域是块(以及它的子块),这是for循环。
function letTest() {
let i=100
for(i=0; i<2; i++) {
//some code here
}
}
因为let在它自己的块和子块(可能是for循环)中可用,所以它的初始值从100更改为0,然后在for循环结束后更改为2。
function letTest() {
let i=100
for(let i=0; i<2; i++) {
//some code here
}
}
因为你在一个块中重新声明了let,所以这里的'i‘将具有块的作用域,如上面的第二个例子所示。因为它有块作用域,所以在块之外不可用。
https://stackoverflow.com/questions/51663070
复制相似问题