目录
4.块儿级作用域(const和let一样,都是块儿级作用域)
可以直接声明变量(let a),可以同时声明多个变量(let b,c,d),也可以直接赋值(let e=100),当然,也可以在同时声明多个变量的同时进行赋值(let f=521,g='i love you',h=[]),但是有一个需要注意的点,就是变量不能重复声明,如果重复声明的话会报错。
变量只在代码块以内有效,出了代码块就没有效了。举个栗子!


变量不能在变量未声明之前使用,它不像var有变量提升,var在未声明之前使用的话会显示undefined。



虽然school是块儿级作用域,但是在函数内部找不到school这个变量,它还是会向上级作用域查找。
我们来写一个小案例,之间我们也有写过:

代码:
- <div>
- <h3>点击切换背景颜色: h3>
- <div class="item">div>
- <div class="item">div>
- <div class="item">div>
- div>
- <script>
- var items = document.querySelectorAll('.item')
- for(var i=0; i
length; i++){ - items[i].onclick = function(){
- this.style.background = 'skyblue'
- }
- }
- script>
- body>
我们之间呢,是在点击事件中用了this来指定元素来改变背景颜色,一开始我们肯定犯了一个错误,就是我们用【items[i].style.background = 'skyblue'】却没有任何用,这是为什么呢?
其实这个变量i是一个全局变量,如果我没有记错的话,for循环和点击事件是一个异步任务,当我们点击时,此时的变量i已经跳出循环变成3了。当点击时,发现没有变量i,然后去上一级查找,找到window.i,此时window.i = 3,那它当然会没有反应啊!!!
所以想改变这个,一是把【items[i].style.background = 'skyblue'】改成【this.style.background = 'skyblue'】;二是把【var i = 0】改成【let i = 0】,有了块级作用域,也就不会报错。
const和let不同,let声明常量时,可以不赋于初始值,但是如果const没有赋于初始值时,不然会报错。
- //1.声明变量
- const A;
- //2.const必须赋于初始值
- const B = 'am B'
- console.log(B)


- const B = 'am B';
- B = 'am not B'
- console.log(B)

- const TEAM = ['UZI','MXLG','MING','Letme'];
- TEAM.push('Meiko')
- console.log(TEAM)

暂时性死区:创建了变量但是没有初始化,没法使用变量,只在变量创建阶段有变量提升,在初始化阶段没有提升,形成了暂时性死区