12let和const
(1)let
- 不挂载在window上
- 不会进行变量提升,必须先声明再使用,否则报错(暂时性死区)
- 不能重复在同一作用域下声明同一个变量名
- 会产生块级作用域,所声明的变量只在 let命令所在的代码块内有效。
- special:for循环的小括号也会形成作用域,代码块是这个小括号的子作用域。
//先声明再使用(暂时性死区)
//✅
let a = 123;
{
console.log(a);
};
//❎Cannot access 'a' before initialization at XXX
let a = 123;
{
console.log(a);
let a = 456;
};
//只在代码块内有效
{
let a = 10;
var b = 1;
}
console.log(a);//报错:ReferenceError: a is not defined.
console.log(b);//1
for循环遍历时,无需像var一样使用闭包和立即执行函数了,因为他会单独形成一个作用域
<body>
<div class="box">0</div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<script>
for( let i = 0; i < boxs.length; i++ ){
boxs[i].onclick = () => {
console.log(i);
};
};
</script>
(2)const
- 不挂载在window上
- const声明一个只读的常量,不能再重新赋值
- 不会进行变量提升,不能重复在同一作用域下声明同一个变量名
- 必须初始化,否则报错。不能在初始化前使用他(暂时性死区)
- 会产生块级作用域,所声明的变量只在 const命令所在的代码块内有效。
const num = 1;
++num;//❎Uncaught TypeError: Assignment to constant variable.atXXX
const abm = 123;
function some_e () {
console.log( abm );
{
const abm = 456;
}
};
some_e();//123
const qwe = 123;
console.log( window.qwe );//undefined