专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

去T3出行面试前端,被问for循环中嵌套定时器执行结果该如何理解?

ins518 2024-10-05 20:33:45 技术文章 15 ℃ 0 评论


1(结果和原理).for(var i = 0;i<3;i++){

setTimeout(function(){

console.log(i)

},1000)

};

问题一:面试的问题:打印出什么?解释执行 原理?

百度--for循环中嵌套setTimeout,执行顺序和结果该如何理解? https://www.cnblogs.com/Trista-l/p/7380830.html


涉及:同步异步,作用域范围

第一 同步 异步,

JS是单线程环境(js的执行机制),也就是说代码的执行是从上到下,依次执行--同步

同步:指在主线程上排队执行的任务,会阻塞后续代码的执行----for循环是同步代码

异步:任务队列中,不阻塞下面代码执行----setTimeout中的是异步代码

常见的异步函数:

定时器:setTimeout, setInterval

ajax异步请求

promise

那么JS碰到这个有同步和异步的情况下会先从上到下执行同步代码,碰到异步的代码会将其插入到任务队列当中等待。


第二:作用域范围

作用域:变量等资源的作用范围

同步代码执行完毕,开始执行异步的setTimeout代码时--->setTimeout中需要一个变量 i --->而执行的时候在当前的作用域中开始找,找不到变量i的定义--->这时就把全局作用域作为当前作用域,也就是找到了for循环中i --->找到了之后就结束寻找变量i的行程。由于这个时候的i是全局的,而且人家已经变为了最终形态:3,setTimeout找到的就是这个i=3;所以就输出了3,下面的3次setTimeout 的执行都是类似,所以结果都是3;

附注:

js执行机制?

概念:javascript语言的一大特点就是单线程----javascript 是为处理页面中用户的交互,以及操作DOM而诞生的,比如我们对某个DOM 元素进行添加和删除操作,不能同时进行,应该先进行添加,之后再删除

缺点:所有任务需要排队,前一个任务结束,才会执行后一个任务,这样所导致的问题是:如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

为了解决这个问题,利用多核CPU的计算能力,HTML5提出Web Worker 标准,允许JavaScript脚本创建多个线程,于是,---->js中出现了同步和异步。

同步:前一个任务结束后再执行后一个任务,会阻塞后续代码的执行----在主线程上执行,形成一个执行栈

异步:放在任务队列它们的本质区别:这条流水线上各个流程的执行顺序不同

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表