如何理解setTimeout里面的异步?

发布于 2022-09-03 08:19:03 字数 178 浏览 14 评论 0

比如:

for(var i=0;i<10;i++){
    setTimeout(function() {
        console.log(i);
    }, 0);
}

我一直以为这里是因为闭包才输出10个10,后来面试官告诉我是因为异步,为什么是异步呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

放我走吧 2022-09-10 08:19:03
  1. 你问为什么这里输出10的原因是异步?
    我只能告诉你,因为setTimeout()函数是异步的

  2. 为什么setTimeout()函数是异步的?
    这个问题你得去问Brendan Eich

  3. 如果你想问的是这里为什么输出10?
    因为异步函数必须等主进程运行完毕才会运行,setTimeout()内部回调运行的时候,主进程已经运行完毕了,此时i=10,所以输出10。

御弟哥哥 2022-09-10 08:19:03

setTimeout的延迟不是绝对精确的;
setTimeout的意思是传递一个函数,延迟一段时候把该函数添加到队列当中,并不是立即执行;
所以说如果当前正在运行的代码没有运行完,即使延迟的时间已经过完,该函数会等待到函数队列中前面所有的函数运行完毕之后才会运行;也就是说所有传递给setTimeout的回调方法都会在整个环境下的所有代码运行完毕之后执行

    setTimeout(function(){
        console.log("here");
    }, 0);
    var i = 0;
    //具体数值根据你的计算机CPU来决定,达到延迟效果就好
    while (i < 3000000000) {
        i ++;
    }
    console.log("test");

运行以上代码,你会发现,上面的函数会等待while循环执行完毕之后才会运行,同时你还会发现,here输出在test的后面;

情绪少女 2022-09-10 08:19:03

用伪代码表示就是(顺序自上而下)
主线程:

for (var i = 0; i < 10; i++) {
    setTimeout(function() {
    }, 0);
    //注册了10个定时器
}
//....执行其他的代码

//执行异步代码:
//这时i已经变成了10,i=10;
//console.log(i)  10次

异步其实就是你去吃饭,但是厨师告诉你不能立即做好,需要等一段时间(主线程在跑其他代码)。
然后因为你很饿,所以你催了10次(注册了10次异步)。
等厨师有时间了,才回应你的要求并且给你做饭。

孤千羽 2022-09-10 08:19:03
setTimeout(function(){
    console.log(1);
}, 2000);
console.log(2);

你看看 1 先输出还是 2 先输出,所谓异步,就是脱离你目前的执行流程。

天邊彩虹 2022-09-10 08:19:03

因为 settimeout 就是被设计成异步的啊,难不成你是想问它为什么是异步的!

霊感 2022-09-10 08:19:03

哪里有闭包? 闭包是为了不输出 10 个 10 吧?

喵星人汪星人 2022-09-10 08:19:03

这里绝对有闭包的作用,你不知道的js上册说的很清楚。
比如
for( var i=1; i<=10; ++i ){

(function(){
    var j = i
    setTimeout( function(){console.log(j)},0 )
})()

}
这里就会输出1,2,3。。。。10

烟柳画桥 2022-09-10 08:19:03

推荐你看下这篇文章,刚好说的就是这个问题,里面讲解的很详细
80% 应聘者都不及格的 JS 面试题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文