let与const
- let是用来定义变量的,在同一个作用域里面,不能用let定义相同的变量名,块级作用域内部的函数声明语句,建议不要使用,优先使用函数表达式,let定义的变量不会进行变量提升,由let声明的变量是在块级作用域里面,只要在块级作用域里用let定义了变量,它所声明的块级作用域霸道,也就是我们常说的暂时性死区,下面我们通过代码来加深理解:
//a) 这里用let定义的变量i没有进行变量提升,此时输出的i在代码里根本就没有被定义
console.log(i) //Uncaught ReferenceError: Cannot access 'i' before initialization
let i=20
//b) 这里用let两次定义了相同的变量名并赋值,输出a的时候控制台会告诉你这个a已经被声明过了,使用let变量不会覆盖之前的a的值
let a=5;
let a=10;
console.log(a) //Uncaught SyntaxError: Identifier 'a' has already been declared
//这里需要加注说明,如果使用了var声明了变量也是不能再使用let声明了,使用了let声明了变量也是不能再使用var声明了
let a=20
var a=15
console.log(a) //Uncaught SyntaxError: Identifier 'a' has already been declared
var a=15
let a=20
console.log(a) //Uncaught SyntaxError: Identifier 'a' has already been declared
//但是我们可以对a进行重新赋值,下面的这种写法不会报错
let a=5;
a=10;
console.log(a) //10
//c) let声明的变量只在块级作用域里面生效,这里外部输出的a根本就没有被定义过,所以控制台会输出a is not defined
{
let a=20;
console.log(a) //20
}
console.log(a) //text1.html:15 Uncaught ReferenceError: a is not defined
//d)暂时性死区,这里在不写块级作用域里面的a的时候,是可以正常输出20的,但由于在块级作用域里面使用let声明了a的值,会导致它声明的这个a霸占了整个块级作用域;暂时性死区简单理解,就是在块级作用域内,不能使变量进行提升,所以在声明变量前使用变量会报错
let a=20;
{
console.log(a) //Uncaught ReferenceError: Cannot access 'a' before initialization
let a=15
}
//e) 在这里我们强调一下,使用let变量的时候是点击第几个显示第几个的下标,但如果使用var,无论你点击哪一个,都是会输出最后一个i
<ul>
<li style="width: 300px;height: 300px;background-color: red;">11</li>
<li style="width: 300px;height: 300px;background-color: blue;">22</li>
<li style="width: 300px;height: 300px;background-color: blueviolet;">33</li>
</ul>
<script>
var oList = document.querySelectorAll('li')
for(let i=0;i<oList.length;i++){
oList[i].onclick = function(){
console.log(i)
}
}
</script>
- const是用来定义常量的,且常量的值不能被修改,和let一样也不可以重复声明,不会进行变量提升,是块级作用域,const修饰引用类型的时候,要注意,它限制的是地址,为了便于理解,还是上代码:
//a) 和let一样这里的a已经被定义过了,不能被重复定义,会报错
const a=10;
// const a=20;
// var a=20
// let a=20
console.log(a) //Uncaught SyntaxError: Identifier 'a' has already been declared
//b)和let一致的就不细说了