1.let命令
基本用法
- 同其他声明变量的用法一样,在for循环计数器中就很适合用let
- 与var的区别就在于下面这个经典的例子啦
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);
// ReferenceError: i is not defined 如果是var声明的输出就是10啦
- 还有一个比较让人容易困惑的例子就是下面这个了。我的理解就是首先在for循环中给每个a[i]定义函数,函数只有在调用的时候才会运行起来,此时console.log(i)中的i就是10,无论是a[几]()输出都是10。
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
- for循环的一个特别之处就在于设置循环变量的部分是父级作用域,而循环体内部是单独的子作用域
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
变量提升
- 变量提升就是未声明前使用值为undefined,下面var声明的i就是有变量提升,let和const就没变量提升
console.log(i)//undefined
console.log(j)//ReferenceError: Cannot access 'j' before initialization
console.log(k)//ReferenceError: Cannot access 'k' before initialization
var i = 0;
const j = 1;
let k = 2;
暂时性死区
- 只要在块级作用域中用let声明的变量就会绑定在这个块级作用域中,不再受外部的影响,所谓的不受外部影响就是,外部有同名变量就等于看不到。即在用let或者const声明之前这些变量都不可用(下面这个例子是这样)
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
不允许重复声明
- let不允许在同一作用域中重复声明同一个变量
2.块级作用域
- es5没有块级作用域只有全局作用域和函数作用域
- 一个花括号里面就是一个块级作用域
- 函数可以在顶级作用域和函数声明中使用,也可以在块级作用域中声明,但是在块级作用域中声明的函数如同let声明的变量一样,在块级作用域外部不可用。
3. const命令
基本用法
-
声明变量的方法如其他一样,但是const声明的变量必须一旦声明就得初始化
本质 -
对于const声明的变量,简单数据类型(数值,字符串,布尔值)的值不可改动,但是对于复合数据类型来讲(对象和数组)却是可以改动的。原因在于对于const声明的变量,并不是变量的值不能改变,而是变量指向的那个内存地址所保存的数据不得改动,对于简单数据类型内存地址上保存的数据就是值,而复合数据类型变量指向的内存地址中保存的是指向实际数据的指针。
es6声明变量的六种方法 -
var,function,let,const,import,class
4.顶层对象的属性
- 在es5中顶层对象的属性与全局变量等价,在es6中var和function命令声明的全局变量依然是顶层对象的属性,但是let,const,class命令声明的全局变量不属于顶层对象的属性。