原始js的var来进行变量的定义,ES6出台后,变量的定义方式 发生了变化,出现 let const 存在块级作用域 {作用域空间},let定义的变量只在对应的作用域中生效
var x=20 //两个作用域:全局 局部:函数内部才叫局部
var lis=document.getElementsByTagName("li")
for(var n=0;n<lis.length;n++){ //全局中的n=4
lis[n].onclick=function(){
console.log(n)//4
}
}
//而使用let则会出现点谁出现谁的下标
var lis=document.getElementsByTagName("li")
for(let n=0;n<lis.length;n++){
lis[n].onclick=function(){
console.log(n)
}
}
第一个不同:let与const新增了块级作用域
if(true){
var x=20
}
console.log(x)//20
if(true){
let x=20
}
console.log(x)//x is not defined
第二个不同:var定义变量,存在变量的默认提升功能,let与const 不存在变量的提升问题
console.log(x)//Cannot access 'x' before initialization未初始化x
let x=20
console.log(x)//undefined
var x=20
var定义的会出现声明被提前到作用域顶部,赋值保留在原地,而let定义的直接会出现未定义x
第三个不同:var 可以重复定义 ,let与const不允许重复定义
let x=20
let x=30
console.log(x)//Identifier 'x' has already been declared 已经被初始化
var x=20
var x=30
console.log(x)//30
var可以重复定义,前面的值会被后面定义的值所覆盖,而let重复定义直接报错,这样更严谨防止写代码是出现值的覆盖
第四个不同:var定义的变量默认挂载到window对象上,let和const不会
var x=20
console.log(window.x)//20
let x=20
console.log(window.x)//undefined
第五个不同:let和const存在暂时性死区问题
let a=20
if(true){
a=40
console.log(a)//Cannot access 'a' before initialization
let a=30
}
let a=20
if(true){
a=40
console.log(a)//40
}
只要在作用域中使用let定义了变量,就必须在定义后使用 ,哪怕全局有,也不能使用,想要输出a无需再定义
const 与let区别 :const是定义常量的,let是定义变量
const y=30
y=40
console.log(y)//Assignment to constant variable.常量无法再赋值
let x=20
x=30
console.log(x)//30
const定义的是个常量只能赋值一次,而let定义的可以重复赋值