<script>
// 同步:指的是代码严格按照书写顺序执行。
// 至今为止,我们学习过的知识中,只有事件和setInterval、setTimeout不是同步 其它的代码 比如分支判断 循环语句都是同步
// for (var i = 0; i < 10; i++) {
// console.log(i);
// }
// 异步:指的是代码不严格按照书写顺序执行
// 事件属于一种异步, setInterval、setTimeout也属于一种异步
// var a = 10;
// setTimeout(function() {
// console.log(1);
// }, 2000);
// console.log(a);
// 1 提升
// 2 给a赋值为10
// 3 执行setTimeout
// 会将第一个参数(函数)交给window并告知: 1000毫秒之后把这个函数还给我 我来执行
// 因为setTimeout执行完毕 就继续往下走
// 4 输出a 也就是10
// 至此 没有任何后续代码可以执行了
// 等1000毫秒 时间到之后,浏览器会将之前得到的函数交还给JS JS又有内容可以执行了 所以此时才会输出1
// 介绍:JS是单线程,同一时间只能够做一件事情
// JS的代码执行队列: JS在执行代码的时候,因为它的单线程特点,在某一瞬间只能够做一件事情。
// 因为代码有很多,又因为单线程,所以不能够同时执行多条代码,所以必然要对代码进行先后排序。
// 同步代码会按照书写顺序进行排序。
// 异步代码: 有些任务是耗时很长的,这种情况下,会将代码推迟执行。所以会出现代码的书写位置与执行顺序不一致的情况 这样的代码叫做异步代码。
// setInterval setTimeout的第一个参数属于异步代码
// var a = 10;
// setTimeout(function() {
// console.log(1);
// }, 0);
// for (var i = 0; i < 1000; i++) {
// console.log(a);
// }
// 以上代码的输出顺序 先输出1000次10 再输出1次1
// 理解一下作用域 + 异步
// for (var i = 0; i < 10; i++) {
// setTimeout(function() {
// console.log(i);
// }, 0);
// }
// 问: 以上代码输出多少次 输出什么
// 解读代码:
// 1 提升
// 2 开始for循环的第一次 i=0; 比较 开启一个延时器 i++
// 开始for循环的第二次 i=1; 比较 开启一个延时器 i++
// 开始for循环的第三次 i=2; 比较 开启一个延时器 i++
// 开始for循环的第四次 i=3; 比较 开启一个延时器 i++
// 在某一次的循环时 延时器的时间已到 此时window会将函数交还给JS的执行队列 放入了末尾 因为for循环没有执行完毕,所以不会执行到
// 开始for循环的第n次 i=n - 1; 比较 开启一个延时器 i++
// ...
// 开始for循环的最后一次 i = 9 比较 开启一个延时器 i++ 变为10
// 执行第一个for循环开启的延时器 输出i 此时i为10
// 执行第二个for循环开启的延时器 输出i 此时i为10
// 执行第三个for循环开启的延时器 输出i 此时i为10
// 执行第四个for循环开启的延时器 输出i 此时i为10
// 执行第五个for循环开启的延时器 输出i 此时i为10
// 执行第六个for循环开启的延时器 输出i 此时i为10
// 执行第七个for循环开启的延时器 输出i 此时i为10
// 执行第八个for循环开启的延时器 输出i 此时i为10
// 执行第九个for循环开启的延时器 输出i 此时i为10
// 执行第十个for循环开启的延时器 输出i 此时i为10
</script>