面试准备(5)一道关于循环,事件执行顺序的题进行剖析
先来一个开胃菜。。
下面输出什么
复制 for(var i=0;i<5;i++){
setTimeout(()=>{
console.log(i)
},1000)
}
啊,这么简单,谁不会啊,五个5嘛
那么我来提个需求,改造上面的代码使其输出 0 1 2 3 4,
你有几种实现方案呢?(狗头警告)
我们来想一想思路
第一种方案 使用闭包
复制 for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j)
}, 1000)
})(i)
}
第2种方案 使用es6中的块级作用域
复制 for(let i=0;i<5;i++){
setTimeout(()=>{
console.log(i)
},1000)
}
哈,这有什么难的嘛
那我这边再提一个需求,稍微改动一下代码使其输出 5 0 1 2 3 4
你有什么好的方案呢?
首先你要想到js是单线程的,执行顺序是什么呢? 是先宏任务后微任务? 还是先微任务再宏任务?
宏任务和微任务都有哪些呢?等等
下面提供一种方案~ 有更好的方案不妨在下面留言哦~~~
复制 //5 0 1 2 3 4
for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j)
}, 1000)
})(i)
}
console.log(i)
(o)/~ 是不是感觉还行,不妨再往下看。
我现在的需求是输出** 0 1 2 3 4 5**
你可别跟我说,吧循环里的5换成6不就完事了嘛,
可不是这样的(狗头警告),想一想要怎么解决呢?
闭包?promise?
下面我来给大家提供两个方案
第一种 闭包
复制// 0 1 2 3 4 5
for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j)
}, 500*j)
})(i)
}
setTimeout(()=>{
console.log(i)
},500*i)
第二种 promise
使用promise 定义多个异步任务
复制 const tasks = []
for (var i = 0; i < 5; i++) {
((j)=>{
tasks.push(new Promise((resolve)=>{
setTimeout(()=>{
console.log(j)
},j*500)
}))
})(i)
}
// 等待所有异步任务完成
// 这个没出来5 不知道为什么? 按提供的promise方法是这样写的 但是人是活的嘛 用了下面setTimeout
Promise.all(tasks).then(()=>{
console.log(i)
})
setTimeout(()=>{
console.log(i)
},500*i)
作者:小靓仔
出处:https://www.cnblogs.com/loveliang/
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。
出处:https://www.cnblogs.com/loveliang/
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档