js中let const var的区别

1.var声明的变量会存在变量提升,而let 和 const的变量不会存在变量提升

也就是var声明的变量会被提升到他所在的作用域顶端去

// var:
console.log(a) // 打印为 'undefined'
var a = 1
// let 和 const
console.log(b) // 报错, b没有被声明
let b = 2
console.log(c) // 报错, c没有被声明
const c = 3

2.var声明的变量会挂载到window上,会放在全局,let 和 const声明的变量不会

var a = 1
console.log(a, window.a) // 1  1
let b = 2
console.log(b, window.b) // 2  undefined
let c = 3
console.log(c, window.c) // 3  undefined

3.let和const声明的变量会形成块级作用域,var不会

也就是用let命令新增了块级作用域,外层作用域无法获取到内层作用域,非常安全明了。即使外层和内层都使用相同变量名,也都互不干扰。

{
	let b = 1
	var c = 2
	console.log(b) // 1
}

console.log(c) // 2
console.log(b) // b is not defined,b不可以访问内层作用域值

4.let和const不能在同一作用域下声明同一变量名,而var可以

var a = 3
console.log(a)  // 3
var a = 5
console.log(5) // 5
//直接会报错:b已经被声明
let b = 1
console.log(b) 
let b = 2
console.log(b) 

PS:注意!!! 按照上面的理解大家肯定会认为a打印的值为什么不是上面声明的全局变量呢?

var a = 1
{
	console.log(a) // 这里打印会报错“Cannot access 'a' before initialization”
	let a = 1
}

上面代码中,存在全局变量a,但是块级作用域内let又声明了一个局部变量a,导致后者绑定这个块级作用域,所以在let声明变量前,对a赋值会报错。

ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。

敲黑板了!!!!!!那在for循环中let,const,var 又会有什么区别呢???
看一下使用var声明的

for (var i = 0; i < 3; i++) {
	setTimeout(() => {
		console.log(i)
	}, 1000)
}

在这里插入图片描述
可以看到这里的打印结果为3次3,一看懵了原谅我还是个小菜鸟。。网上百度了许多,这里写一下自己的理解。。。
for循环是同步任务,setTimeout是异步任务,因此要for循环完毕后才会执行setTimeout()。
②使用var声明的变量i是全局变量,在执行完for循环后,i已经变成了3,异步队列中有3次setTimeout任务,访问到的i都是同一个,这个时候打印出来的i当然是为 3 了

接下来看下let声明的

for (let i = 0; i < 3; i++) {
				setTimeout(() => {
					console.log(i)
				}, 1000)
			}

在这里插入图片描述
可以看到打印结果。更加诧异了,和var声明的打印出来的结果完全不同,执行过程还是和 ① 相同,唯一不同的是,此时for循环出来的i每次都不同,每次都创建了一个新的i,因此在异步任务的时候输出对应的i

要注意的是:不能使用const去声明,因为const是常量
在这里插入图片描述

你可能感兴趣的:(javascript)