【发布时间】:2018-08-02 22:40:23
【问题描述】:
我试图了解 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
}
但是,当我们在 for 子块中使用关键字 let 重新声明并为同一变量 x 分配新值时会发生什么:
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同名变量?
【问题讨论】:
标签: javascript variables scope hoisting shadowing