<!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异步请求