大部分人一般使用的是var
但是在es6中添加了let和const,语法逐渐规范化,大家是否在for循环遍历的时候,单击多个,每一个都有各自的效果,但是事实上只有一个有效果,为什么呢,有可能是代码哪里问题,可能会报错,但是没有报错,又效果出不来,估计是使用了var命名变量了。
let
ES6明确规定,如果区块中存在let命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。所以在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
这里还有个点要说明的,就是 for循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。
var和let
1、函数作用域 vs 块级作用域
let声明的变量只在代码块(通常是{ }所形成的代码块)中有效。
2、变量提升 vs 暂时性死区
3、let不允许重复声明
4、全局变量 vs 全局对象的属性
const
使用const声明变量的时候,必须同时赋值,否则会报错。
注:复合类型const变量保存的是引用。因为复合类型的常量不指向数据,而是指向数据(heap)所在的地址(stack),所以通过 const 声明的复合类型只能保证其地址引用不变,但不能保证其数据不变。