// 例子
function getValue (condition) {
if (condition) {
let value = 'blue';
return value;
}
console.log(value)
// 报错 value is not defined
}
getValue()
在同一个作用域内不能使用let声明同名的变量
// 不管是var,const或者let,新的let声明之前同名的变量,都会报错
var count = 30;
let count = 40;
// 报错 Identifier 'count' has already been declared
// 函数形参和函数内部的let声明变量重名,报错
function test(value) {
let value = 3;
}
test()
// 报错 Identifier 'value' has already been declared
// 在不同的作用域声明的变量重名是没问题的
let count = 30;
if(true) {
let count = 40;
// 不同的作用域,不会报错
}
// 第一个对比
// before
for(var i = 0; i < 5; i++) {
// ... 省略一些代码
}
console.log(i) // 5
//after
for(let i = 0; i < 5; i++) {
// ... 省略一些代码
}
console.log(i) // 报错 i is not defined
// 第二个对比
// before
var funcs = [];
for(var i = 0; i < 10; i++) {
funcs.push(() => {console.log(i)})
}
funcs.forEach((ele) => {
ele()
})
// 打印 10次 10
// after
var funcs = [];
for(let i = 0; i < 10; i++) {
funcs.push(() => {console.log(i)})
}
funcs.forEach((ele) => {
ele()
})
// 打印 0 1 2 3 4 5 6 7 8 9
注意:有一点很重要,let 声明在循环内部的行为是标准中专门定义的,它不一定与 let 不提升特性有关。
循环中的const声明
// for 循环会报错
for (const i = 0; i < 1; i++) {
console.log(i)
}
// 打印 0 ,然后报错 Assignment to constant variable.
// for-in 和 for-of 不会报错
var object = {
a: true,
b: true,
c: true
};
for (const key in object) {
// 不要在循环体内更改key的值,会报错
console.log(key)
}
// 打印 a b c