`
小抽又回来了
  • 浏览: 11054 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JS For循环内部延时执行(For循环延时)

js 
阅读更多

JS For循环内部延时执行(For循环延时)

 

JS

 

我没猜错的话,你写的 for循环延时执行 是这样写的:

 

for (var i = 0; i < 6; i++) {

    setTimeout(function () {

        console.log(i);

    }, 1000)

}

1

2

3

4

5

是不是发现出错了啊?哈哈哈

是不是觉得应该输出0,1,2,3,4,5。但是结果却是六个6 ?

 

经过我一下午的琢磨和研究,找到原因,并且找到了解决办法。

 

原因:

js是单线程的,在执行for循环的时候,定时器被放到任务队列中等待执行,等到定时器可以执行的时候,for循环已经跑完了因此打印出六个6。

 

解决方法:

 

for (var i = 0; i < 6; i++) {

    (function (t, data) {   // 注意这里是形参

        setTimeout(function () {

            console.log(`这是第 ${t} 次,这是其他参数:${data}`);

        }, 1000 * t);// 还是每秒执行一次,不是累加的

    })(i, '其他参数')   // 注意这里是实参,这里把要用的参数传进去

}

1

2

3

4

5

6

7

原理:

 

作用域问题

在js中,一个{}就是一个代码块,我们在for循环中定义的i变量,全局可以使用,循环中的每一次给i赋值,都是给全局变量i赋值,每次循环都会产生一个代码块,每个代码块中的都是一个新的变量

 

立即执行的匿名函数

给外部包装了一个立即执行的匿名函数,setTimeout里面的匿名函数不再引用外部函数的参数,而是直接引用外部匿名函数的参数,使得延迟函数的回调可以将新的作用域封闭在每次迭代的内部。

 

 

原文链接:https://blog.csdn.net/qq_17627195/article/details/112376567

 

分享到:
评论

相关推荐

    javascript延时执行跳转或执行函数

    3. 延时次数:如果需要多次延时执行,可以使用递归或者循环来实现。例如,定义一个计数器变量,并在`setTimeout`的回调函数中检查计数器,当达到预设的延时次数时停止执行,否则再次调用`setTimeout`。 4. 回调函数...

    js延时函数 JS延时

    在JavaScript编程领域,延时函数(也常被称为定时器或延迟执行函数)是开发者们频繁使用的工具之一。它们主要用于控制代码的执行顺序,为异步操作提供必要的等待时间,从而实现更加灵活和高效的程序设计。根据给定的...

    js延时方法

    在JavaScript编程领域,延时操作是一项常见且实用的功能,它允许开发者控制代码执行的时间间隔,这对于实现动画效果、网络请求的节流与防抖、定时任务等场景至关重要。本文将深入探讨自定义JavaScript延时方法的实现...

    延时实现,Handle

    比如在Node.js中,事件循环机制和异步操作(如文件I/O、网络请求)会返回一个Promise对象,这个Promise就像一个Handle,持有对异步操作的引用,开发者可以通过监听`.then`和`.catch`来处理操作完成后的结果。...

    Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)

    JavaScript编程中,定时器函数setInterval和setTimeout是实现定时执行代码和循环执行代码的基础方法。这两个函数是Window对象的方法,允许我们在指定的时间间隔后执行代码,或者在指定的时间后执行一次代码。 ...

    商业编程-源码-这是一个产生产生毫秒级时钟延时的程序.zip

    在编程领域,毫秒级时钟延时是一个常见的需求,特别是在需要精确控制程序执行流程或者进行性能测试的场景。这个“商业编程-源码-这是一个产生产生毫秒级时钟延时的程序”可能包含了实现这一功能的源代码。在不同的...

    js中setTimeout的妙用--防止循环超时

    在JavaScript中,`setTimeout`是一个非常重要的异步编程工具,它可以用来执行函数或者代码块,但不是立即执行,而是等待指定的时间后才开始执行。在处理某些特定问题时,如防止循环超时,`setTimeout`能展现出其独特...

    解决双iframe互相刷新进入死循环的问题

    这个问题通常发生在两个或多个iframe之间尝试通过JavaScript互相重载对方,导致无限循环,严重影响用户体验并可能导致浏览器崩溃。 首先,让我们深入理解问题的原因。当两个iframe A和B相互引用并试图重载对方时,...

    JavaScript基础练习_day4

    这是因为浏览器或Node.js的事件循环机制可能会导致定时任务的实际执行时间比预期稍晚。例如,如果有大量的同步代码在执行,或者线程阻塞等情况发生,那么`setTimeout`的实际触发时间可能会有所延迟。具体原因可参考...

    16-WebAPI:setTimeout是如何实现的?_For_vip_user_0011

    在Chrome浏览器中,存在一个额外的延迟执行队列,专门用于存储需要延时执行的任务。当设置一个setTimeout时,浏览器会创建一个包含回调函数、起始时间和延迟时间的任务对象,并将其添加到这个延迟队列中。这样,即使...

    JS定时器使用,定时定点,固定时刻,循环执行详解

    JavaScript中的定时器是开发者在网页交互中实现自动化和延时操作的重要工具。本文将深入探讨两种主要的定时器方法——`setTimeout()`和`setInterval()`,以及如何利用它们实现定时定点和循环执行。 1. `setTimeout...

    JavaScript代码执行的先后顺序问题

    所以,如果在循环中设置延时器,由于JavaScript是单线程的,循环会继续执行,而setTimout内的回调会等待循环结束后才被调用。 最后,关于代码的执行顺序,可以得出以下几点: 1. JavaScript引擎首先进行变量和函数...

    js代码-js 延时

    JavaScript是单线程的,因此延时操作是通过事件循环和回调函数实现的。当调用`setTimeout`或`setInterval`时,它们并不会立即执行,而是将任务添加到事件队列中,等待主线程空闲时处理。 四、Promise与async/await ...

    javascript间隔定时器(延时定时器)学习 间隔调用和延时调用

    用setInterval方法可以以指定的间隔实现循环调用函数,直到clearInterval方法取消循环 用clearInterval方法取消循环时,必须将setInterval方法的调用赋值给一个变量,然后clearInterval方法引用该变量。 代码如下:...

    实例分析JS与Node.js中的事件循环

    事件循环是JavaScript和Node.js中的重要概念,它允许JavaScript和Node.js以非阻塞的方式执行代码。理解事件循环机制是深入理解JavaScript和Node.js运行原理的关键部分。 首先,JavaScript之所以采用单线程模型,是...

    js Date自定义函数 延迟脚本执行

    总结来说,文档中介绍的使用JavaScript Date对象和循环实现延迟执行的原理虽然简单,但在实际开发中不推荐使用。相反,应使用更高效和现代的JavaScript技术,比如直接利用`async`和`defer`属性来控制脚本的加载时机...

    JavaScript延时效果比较不错的

    JavaScript是一种广泛应用于网页和网络应用的...总之,JavaScript的延时效果可以通过`setTimeout`和`setInterval`来实现,但实际使用中还需要考虑异步执行、性能优化、浏览器渲染机制等多个方面,以达到理想的效果。

    angular-delay:延迟执行 ngChange 回调

    延迟执行 ngChange 回调。 所有功劳都归功于“Doug R”。 安装 bower install angular-delay 使用 在您的应用程序中包含该包: angular . module ( 'app' , [ 'ngDelay' ] ) ; &lt; input ng-model =" search ...

Global site tag (gtag.js) - Google Analytics