简单了解var const let 的区别
es6中新增声明变量方式,在同一个作用域 全部都是唯一的,禁止重复声明
let
1.let会形成块级作用域
2.不能提前被声明 如果在当前作用域被提前声明的话 会形成暂时性死区
TDZ又称暂时性死区,大概意思是变量在作用域内已经存在,必须在 let或者const声明后面使用。
ES6明确规定,如果区块中存在let/const命令,这个区块用这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用的变量,就会报错( can’t access lexical declaration ‘a’ before initialization)
TDZ本质:只要一进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
// can't access lexical declaration 'a' before initialization
// console.log(a); // bug 暂时性死区,声明之前不能使用
let a= 123;
3.let在函数中不能被当做形参
4.在同一作用域下 var和let不能声明同一个变量
{
let a= 123;
// console.log(a);
// 不能重复声明
// var a = 1; // bug edeclaration of let a 1let.html:18:16note: Previously declared at line 14, column 161let.html:14:16
}
5.防止变量污染可以使用let
// 防止变量污染
// let---> var 就是变量污染
for(let i =0;i<3;i++){
setTimeout(function(){
console.log(i);
},15);
}
// 使用let 代码执行结果会是0 1 2
// 使用var 代码执行结果是 3 3 3
var
1.var除了在函数外都是声明一个全局变量
2.var可以重复命名
3.var可以变量提升
const
1.const是常量
2.const赋值的是基本数据类型的时候 不可以被更改
3.当const被赋值的是引用数据类型的时候是可以被更改的 因为引用数据类型存放的是地址 对象里面的数据是可以更改的
4.不能变量提升 不能重复命名