1. var
var a = 2
相当于:
var a;
a = 2 ;
即: var声明的变量会发生变量提升
1.1 有var 和没有 var 的区别:
1.1.1 在顶级作用域声明
如上,不管用不用var,后面赋值的一定会覆盖前面的赋值
1.1.2 在函数内部用var声明
如上,在函数内部,用var声明的变量,只在函数内部有效
1.1.3 在函数内部不用var声明
在函数内部不用var声明,就相当于声明了一个全局变量,在全局内有效
2. let
2.1 let所声明的变量,只在let命令所在的代码块内有效。
2.2 不存在变量提升, 一定要先声明再使用
2.3 暂时性死区
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
在let存在的那个区块内,tmp被声明之前就被赋值了
2.4 由于以上性质,在for循环中,推荐用let
for (let i = 0; i < 10; i++) {
// ...
}
这样,i就只在循环体内有效。
另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
2.5 不允许重复声明
函数内部也不能重新声明参数
2.6 const
- 声明一个只读的常量。一旦声明,常量的值就不能改变。
- 与let一样, 只在声明所在的块级作用域有效,没有变量提升,有暂时性死区,不可重复声明。
-
一声明就必须马上赋值,只声明不赋值会报错
网友评论