js之let和var在for循环中的区别

先说一点let的块作用域:
只要是大括号 { }中有let,就形成块级作用域,不管是在函数中还是在if中。例如

function fn(){
	let a = 22
	if(true){
		let a = 33		
	}
	console.log(a);
}

fn() // 22

为什么输出的是22 而不是33
因为只要let在大括号里,就形成块级作用域,只能在其本身(大括号内)块级作用域中访问。
在例如:

function fn(){
	let a = 22
	if(true){
		let b = 33		
	}
	console.log(a);// 22
	console.log(b); // 报错:b is not defined
}

fn() 

let 与大括号形成的块级作用域,只能在其大括号中使用,所以b不能被外面访问。

let arr = [1,2,3,4]
for (var i = 0; i < arr.length; i++) {
	setTimeout(()=>{
		console.log(i);
	},100)
}

在这里插入图片描述
以上输出四个4是因为 var 没有块级作用域的概念,而for又是同步函数,setTimeout是异步函数。
js中先执行 完同步函数,才能执行异步函数,所以 i 先执行完,在执行异步setTimeout.

在这里插入图片描述

let arr = [1,2,3,4]
for (let i = 0; i < arr.length; i++) {
	setTimeout(()=>{
		console.log(i);
	},100)
}

输出: 0 1 2 3
为什么此时的 i 不是4了呢?
因为let具有块级作用域的概念,执行的时候是将最外层大括号里的整块执行完毕,才执行下一次循环。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值