欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 = {} 那则会报错
相关标签: ES2015