ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
ES6中增加了块级作用域的概念,
var 可以重复申明,无法限制修改,没有块级作用域
let 不能重复申明,变量-可以修改,块级作用域,只在当前作用域有效
const 不能重复申明,常量-不可修改,块级作用域,只在当前作用域有效
{
var a = 1;
var a = 2;
let b = 1;
// let b = 2; // Uncaught SyntaxError: Identifier 'b' has already been declared
const c = 1;
// const c = 2; // Uncaught SyntaxError: Identifier 'c' has already been declared
console.log(a); // 2
console.log(b); // 块级作用域内可以访问
console.log(c); // 块级作用域内可以访问
}
console.log(a); // 块级作用域外可以访问
console.log(b); // 块级作用域外不可以访问
console.log(c); // 块级作用域外不可以访问
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i); // 3
}, 0);
}
for (let i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i); // 0 1 2
}, 0);
}