先看最基础的解释
{
var a = 10;
}
console.log(a);//10
{
let b = 10;
}
console.log(b);//报错
造成这的问题是,ES5中是没有块级作用域的概念的,就是{},var是ES5的概念,所以这个时候a就相当于全局变量,let是ES6的概念,存在块级作用域,所以在{}外调用{}内的变量就会报错,因此b就报错啦。
也由于这样,var已经被废弃,现在基本上都使用let和const.
let可以被重新赋值,const是常量,没办法重新赋值。
let a = 1;
a = 3;
console.log(a);//3
const b = 2;
b = 3;//报错
作用域链:相当于多个{{}}中的嵌套
底层的作用域可以访问上层的作用域内的变量,而上层的作用域无法访问下层作用域中的变量。
{
let a = 1;
{
let b = 2;
{
let c = 3;
console.log(a);//1
}
}
}
console.log(a);//报错