1. ES5只有全局作用域和函数作用域导致
(1)内层变量可能会覆盖外层变量
(2)用来计数的循环变量会泄露为全局变量
ES5中也可以用闭包实现块级作用域
ES6中新增了块级作用域(由大括号包裹,比如:if(){},for(){}等)
2.(1)var声明的变量存在变量提升 let和const不存在变量提升
(2)var允许重复声明变量。let和const在同一作用域不允许重复声明变量。
(3)var和let 可以修改变量,const声明一个只读的常量,声明后常量的值不可以改变,意味着const一旦声明变量,就必须立即初始化,不能留到以后赋值。const所说的一旦声明值就不能改变,实际上指的是:变量指向的那个内存地址所保存的数据不得改动。
(3)let和const存在暂时性死区。即只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
暂时性死区的本质就是:只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。