(1)块级作用域:es6新增了块作用域,块作用域由{ }包括,let和const具有块级作用域,var不存在块级作用域。
块级作用域解决了ES5中的两个问题:
●内层变量可能覆盖外层变量
●用来计数的循环变量泄露为全局变量
补充:es5中有函数作用域,let,const,var都不能跨函数访问(外部访问函数内部定义的变量)
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
const ali = document.getElementsByTagName('li');
//es5,利用闭包
// for (var i = 0; i < 3; i++) {
// (function closure(index) {
// ali[index].onclick = function () {
// console.log(index)
// }
// })(i)
// }
//es6,利用let块级作用域
for (let i = 0; i < 3; i++) {
ali[i].onclick = function () {
console.log(i)
}
}
</script>
</body>
(2)变量提升: var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否在会报错。
(3)重复声明: var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const和let不允许重复声明变量。
(4)暂时性死区:在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。
(5)初始值设置:在变量声明时,var和let可以不用设置初始值。而const声明变量必须设置初始值。
(6)指针指向: let创建的变量是可以更改指针指向(可以重新赋值)。const声明的变量是不允许改变指针的指向,但允许改变对象属性。
区别 | var | let | const |
块级作用域 | × | √ | √ |
变量提升 | √ | × | × |
重复声明 | √ | × | × |
暂存性死区 | × | √ | √ |
初始值设置 | × | × | √ |
指针指向 | √ | √ | × |
结合以上,我们看道题
var a=1;
function fn(){
console.log(a);//undefined,函数内有a,var变量提升
var a=2;//如果用let,上一行报错,暂存死区,Cannot access 'a' before initialization
console.log(a);//2
var b=9;
}
fn();
//console.log(b);//报错,b is not defined