Var 是全局变量 let const是块级作用域,只在命令所在的代码块内有效
{{{{
{let insane = 'Hello World'}
console.log(insane); // 报错
}}}};
//上面代码使用了一个五层的块级作用域,每一层都是一个单独的作用域。第四层作用域无法读取第五层作用域的内部变量
块级作用域的出现,实际上使得获得广泛应用的匿名立即执行函数表达式(匿名 IIFE)不再必要了。
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
let const日常使用应该注意的点
- 没有变量提升
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // Uncaught ReferenceError: bar is not defined
let bar = 2;
//变量提升的争议: 错误原因:bar没有定义,如果说let bar不存在变量提升,那么在运行上面代码的也应该报出bar没有定义这个错误的,但是错误确是因为foo没有被初始化
//真相:**let和const定义的变量都会被提升,但是不会被初始化,不能被引用**,不会像var定义的变量那样,初始值为undefined。因此,在使用console.log(foo)的时候会发生引用错误。
//const的引用不应被改变。如果编译器把const初始化为undefined,之后,又让它等于我们定义的那个值,就改变了const的引用。因此,委员会决定let和const虽然也会发生变量提升,但是没有任何[初始值]
- 不能重复声明
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
- 暂时性死区
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
//使用`let`命令声明变量之前,该变量都是不可用的,都属于变量`tmp`的“死区” ,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
cons 和 let 区别
-const声明一个只读的常量。一旦声明,常量的值就不能改变
let aa = 2
aa = 3
console.log(aa) // 3
const bb = null
bb = 3
console.log(bb) // Assignment to constant variable
const声明复合类型的数据,只能保证这个指针是固定的地址,但是它指向的数据结构是可变的,
const bb = { name: 'xm', age: 1 }
bb.name = 'xh'
console.log(bb) // 3