由定时器了解js的运行机制

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script>
			
		
//		for(var i=0;i<10;i++){
//   		setTimeout(function(){
//   			console.log(i)  //10个10
//   		},0);
// 		}  


//		for(let i=0;i<10;i++){
//   		setTimeout(function(){
//   			console.log(i)  //let解决
//   		},0);
// 		}

			
//	 	for(var i=0;i<10;i++){
//   		setTimeout((function(){
//   			console.log(i)   //立即执行函数解决
//   		})(),0);
// 		}

//		for(var i=0;i<10;i++){
// 			setTimeout(console.log(i),0); //由上面可知,因为console.log是一个函数,所以也是立即执行函数
//		}

//		for(var i=0;i<10;i++){
//			(function(x){
//				setTimeout(function(){
//   				console.log(x)  //闭包解决
//   			},0);
//			})(i)
// 		}


//		for(var i=0;i<10;i++){
//   		setTimeout("console.log(1)",1000);//连续的10个10
//   		//原因在于加了双引号的console.log()不再是立即执行函数。
//   		//setTimeout() 会判断第一个参数是否是[function],
//   		//如果不是,则会尝试将它当做字符串处理
//   		//会用eval(console.log(1))
// 		}
		</script>
	</body>
</html>

异步执行的运行机制如下:
所有同步任务都在主线程上执行,形成一个执行栈。
主线程之外,还存在一个"任务队列"。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
主线程不断重复上面的第三步。
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会循环反复。

一般来说,有以下四种会放入异步任务队列:
setTimeout和setlnterval
DOM事件
ES6中的Promise
Ajax异步请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值