Let:
- 快级作用域
- 不可重复声明同一个变量
- 不可变量提升、暂时性死区
- 值可被修改
1、块级作用域
块级作用域写在 {} 中,如果没有 {},js会以为没有块级作用域
for 循环中有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for(let i=0; i<3; i++){
let i = 'abc';
console.log(i)
}
// 输出三次 abc
函数的块级作用域
// 浏览器的 ES6 环境
function f() { console.log('I am outside!'); }
(function () {
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();
}());
// Uncaught TypeError: f is not a function
报错的原因是,内部的f()被当做var 变量,被提升声明,等同于以下代码
function f() { console.log('I am outside!'); }
(function () {
var f = undefined
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();
}());
Const:
- 快级作用域
- 声明的时候就得赋值
- 值不可修改
- 不可重复声明
- 暂时性死区
值不可修改
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
1、对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
2、但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。