ES2015 let与块级作用域
程序员文章站
2022-03-08 22:18:40
...
一、块级作用域
在ES2015之前,ES中只有2种作用域:
- 全局作用域
- 函数作用域
ES2015新增了一种作用域——块级作用域,现在有3种了:
- 全局作用域
- 函数作用域
- 块级作用域
块
: 代码中用花括号所包裹起来的范围
举两个常见的块
:
if(true){
console.log('花括号里面是块')
}
for(var i = 0; i<10; i++){
console.log('花括号里面是块')
}
ES2015以前块是没有单独的作用域的,这就导致我们在块里面定义的成员,外部也可以访问到。
这在复杂代码中是很致命的:
if(true){
var a = 0;
}
console.log(a);//0
二、let
有了块级作用域后,我们就可以在代码中,通过一个新的关键字let
去声明变量。
通过let声明的变量,它只能在所声明的这个块
中被访问到。
还是上面的例子,我们把var
改成 let
:
if(true){
let a = 0;
}
console.log(a);// a is not defind
应用场景:
特别适用于for循环,在过去如果我们需要for循环嵌套,往往需要声明2个不同的变量。
// 你是不是期待它打印9次呢?
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
console.log(i);// 结果只打印3次 0 1 2
}
}
我们把var 换成let
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
console.log(i);// 得到期待结果打印9次 0 1 2 0 1 2 0 1 2
}
}
虽然let可以解决for循环中计数器重名的问题,但是不建议在for循环嵌套里面使用同名的计数器,不利于后期里面理解和维护代码。
三、const
const
是在 let
的基础上增加「只读」特性
const 所声明的成员不能被修改,只是说不允许在声明过后重新去指向一个新的内存地址,并不是说不允许修改恒量中的属性成员。
const obj = {}
obj.name = 'luyu' // 并没有修改obj指向的内存地址,它只是修改了这块内存空间的数据
// 如果obj = {} 那则会报错