首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么为同一函数调用window.setTimeout不会引入无限循环?

为同一函数调用window.setTimeout不会引入无限循环的原因是,window.setTimeout是一个异步函数,它会在指定的时间间隔后将指定的函数添加到事件队列中,等待执行。当事件队列中的函数被执行时,它会创建一个新的作用域,并且在该作用域中执行函数的代码。

在调用window.setTimeout时,函数不会立即执行,而是在指定的时间间隔后才会执行。因此,如果在函数内部再次调用window.setTimeout来执行同一个函数,它会在指定的时间间隔后将函数添加到事件队列中,而不会立即执行。这样就避免了无限循环的问题。

具体来说,当调用window.setTimeout时,会将函数添加到事件队列中,并设置一个计时器来记录指定的时间间隔。当计时器到达指定的时间间隔时,事件队列中的函数会被取出并执行。如果在函数内部再次调用window.setTimeout来执行同一个函数,它会将函数再次添加到事件队列中,并设置一个新的计时器。这样,每次函数被执行时,都会创建一个新的作用域,并在该作用域中执行函数的代码,从而避免了无限循环的问题。

需要注意的是,如果在函数内部调用window.setTimeout来执行不同的函数,而不是同一个函数,那么就可能会引入无限循环的问题。因为每次函数被执行时,都会创建一个新的作用域,并在该作用域中执行函数的代码。如果在函数内部调用window.setTimeout来执行不同的函数,那么每次函数被执行时,都会再次添加不同的函数到事件队列中,从而导致无限循环的问题。

总结起来,为同一函数调用window.setTimeout不会引入无限循环的原因是,window.setTimeout是一个异步函数,它会在指定的时间间隔后将指定的函数添加到事件队列中,等待执行。每次函数被执行时,都会创建一个新的作用域,并在该作用域中执行函数的代码,从而避免了无限循环的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法

比如你想周期性执行一个函数 function a(){ //... } 可写 setTimeout("a()",1000) 或者 setTimeout(a,1000) 这里注意第二种形式中...»setInterval() : 按照指定的周期(以毫秒计)来调用函数或计算表达式....会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭; 英文释义»interval() : 间隔;间距;幕间休息; 不难看出, 只要我们仔细体会JS手册及命名释义, 就能很容易的区分开两者的区别...简单的说, 两才的区别在于, setTimeout()方法是在等待指定时间后执行函数, 且只执行一次传入的句柄函数. setInterval()方法是每指定间隔时间后执行一次传入的句柄函数,循环执行直至关闭窗口或...在调用 confirm() 时,将暂停对 JavaScript 代码的执行,在用户作出响应之前,不会执行下一条语句。

3.1K10

Python for死循环

循环 循环是指重复执行一段代码若干次,为什么要有循环?因为循环可以避免大量的代码重复。 死循环 当一个循环可以执行无限次,也就是没有终止条件,我们称这个循环是死循环。...那么有些人就想到了一个办法,步长0不就是一直都不会改变值吗?这样不就是死循环了?事实上还是要通过程序运行来检测,简单的编写了一个程序,如图所示。 ?...可能是因为for i in range的i和i = 0的i不是同一个i,是不是同一个可以通过使用id这个内置函数查看内存地址就行。不要只知其然,还要知其所以然! ? 为什么会选择从300开始循环?...for死循环不会爆内存) 自定义可迭代对象 我之前讲过,要想让一个类实例化出来是一个可迭代对象,必须实现__iter__和__next__两个魔法方法,在这里完全可以对这两个方法动点手脚,实现无限迭代...cycle cycle就是转圈,其构造方法传入一个可迭代对象,比如字符串"abc",for遍历这个对象,会一直循环输出a b c a b c……一直这样无限循环下去,而且不会爆内存。

9.9K20
  • 设置ASP页的Session过期时间的问题

    –每隔900秒刷新一下自己,为了和服务器通讯一下,保持session不会丢–> 这种方法还是比较长见的,另外还有一种和上面类似的方法,不过他不是用meta自动涮新嵌套的iframe...他是用javaSSScript:window.setTimeout(“functionname()”,10000);第隔一段时间时间自动调用一个函数的方法,当然函数里还是要去连接一个空的文件。...RandStr=”+Math.random(); //这里的RandStr=Math.random只是为了让每次back.src的值不同,防止同一地址刷新无效的情况 window.setTimeout(...“keepsession()”,900000); //每隔900秒调用一下本身 } keepsession(); 这样同一目录下建一个空内容的sessionKeeper.asp就文件就可以了...那为什么在ASP页中session.timeout的值最大只能是1440在IIS的属性中却能设的那么大呢?

    1.4K10

    Python 为什么会有个奇怪的“...”对象?

    用它替换 pass,在语法上并不会报错,因为 Python 允许一个对象不被赋值引用。...,当函数调用时,T 的实际类型才被确定。...(4)表示无限循环 最后,我认为有一个非常终极的原因,除了引入“...”来表示,没有更好的方法。 先看看两个例子: ? 两个例子的结果中都出现了“...”,它表示的是什么东西呢?...那么,当其内部元素又引用容器自身时,就会递归地出现无限循环引用。 无限循环是无法穷尽地表示出来的,Python 中用 ... 来表示,比较形象易懂,除了它,恐怕没有更好的选择。...在 Python 中不少的使用场景,除了占位符用法,还可以支持扩展切片语法、丰富 Type Hint 类型检查,以及表示容器对象的无限循环 ...

    2K10

    【React】406- React Hooks异步操作二三事

    这里和上面一节(组件加载时)最大的差异在于 React Hooks 只能在组件级别编写,不能在方法( dealClick)或者控制逻辑( if, for 等)内部编写,所以不能在点击的响应函数中再去调用...但我们依然要利用 useEffect 的返回函数来做清理工作。 以计时器例,假设我们想做一个组件,点击按钮后开启一个计时器(5s),计时器结束后修改状态。...但实际运行下来,在 useEffect 返回的清理函数中,得到的 timer 却是初始值,即 0。 为什么两种写法会有差异呢? 其核心在于写入的变量和读取的变量是否是同一个变量。...,调用后并不会直接生效,因此立马读取 value 获取到的是旧值( 0)。..."true" : "false"} );} 当 setFlag 参数函数类型时,这个函数的意义是告诉 React 如何从当前状态产生出新的状态(类似于 redux 的 reducer

    5.6K20

    字节面试:如何实现准时的setTimeout

    我们可以通过这个场景来进行演示: 运行代码如下,通过一个计数器来记录每一次 setTimeout 的调用,而设定的间隔 * 计数次数,就等于理想状态下的延迟,通过以下例子来查看我们计时器的准确性 function...window.setTimeout(function() { instance(); }, speed); for(var x=1, i=0; i<10000000; i++) { x *= (i +...如何实现准时的 “setTimeout” requestAnimationFrame window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画...该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行,回调函数执行次数通常是每秒60次,也就是每16.7ms 执行一次,但是并不一定保证 16.7 ms。...再看看额外代码的引入效果。 ...

    45610

    100道最新Java面试题,常见面试题及答案汇总

    3、do while循环 Do while 和while循环基本类似,唯一不同的是do while是先执行语句再检查条件,也就是说do while循环至少会执行一次语句。 Q7:什么是无限循环?...如何声明无限循环? 答案:无限循环是指无条件执行,无限运行。无限循环可以由定义中断语句块来结束。 Q8:continue和break语句有什么区别?...s1和s3是对同一个对象的引用。 Q32:为什么Java中的String被称为Immutable? 答案:Java中,string对象是不可变的,一旦赋值不可更改,如果更改,则会创建一个新对象。...同一个进程的多个线程堆栈共享,有助于程序的性能改进。 Q35:为什么在ava中使用Runnable Interface?...答案:如果没有异常处理,那么程序将中止,且不会执行异常抛出之后的语句。 Q89:如果定义了一个类定义了多个构造函数,那么是否可以在一个构造函数调用另一个构造函数

    5.1K21

    并发模型与事件循环

    #import与require import与require都提供引入一个模块的功能,但require是AMD规范下的引入,在运行时调用,而import是ES6规定的引入,编译时调用(因此实际上最早执行...函数具有参数和局部变量,如果函数A调用函数B,并且执行函数A,那么函数A会被先压入栈,调用B时,函数B被压入栈(位于A之上),到函数B返回,其被弹出。 函数被压入栈的实际过程是压入调用帧。...每当调用处理消息的函数,其形成的调用帧被压入栈。该函数可能会调用其他函数,因此只有当执行栈空,JavaScript才能继续处理下一个消息。最终,消息队列为空。...#不打断地执行 如果你理解了队列的执行方式,那么你会明白这种处理方式意味着函数执行决不会被抢占。...一个简单的例子是,先设定一个定时执行的函数,再令JavaScript进入无限循环,无论何时被设定的函数不会执行。

    75420

    web前端开发初学者十问集锦(3)

    9.js无限循环定时器会执行吗? 这里涉及到window.setTimeOut和window.setInterval的异步性,以及js单线程的单线程问题。经常会出现在面试的过程中。...答案是死循环导致setTimeout不执行,也导致alert不执行。 js是单线程是对的,所以会先执行while(t){}再alert,但这个循环体是死循环,所以永远不会执行alert。...至于说为什么不执行setTimeout,是因为js的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的...,所以setTimeout也永远不会执行。...脱离文档流,不会撑开父容器。 固定定位: position:fixed。生成绝对定位的元素,相对于浏览器窗口进行定位。脱离文档流,不会撑开父容器。

    1.6K20

    用动画和实战打开 React Hooks(二):自定义 Hook 和 useCallback

    我们来通过一段动画来演示一下这个”无限循环“到底是怎么回事: 我们的组件陷入了:渲染 => 触发 Effect => 修改状态 => 触发重渲染的无限循环。...想必你已经发现 useEffect 陷入无限循环的”罪魁祸首“了——因为没有提供正确的 deps !从而导致每次渲染后都会去执行 Effect 函数。...事实上,在之前的 useCoronaAPI 中,也是因为传入的 deps 存在问题,导致每次渲染后都去执行 Effect 函数去获取数据,陷入了无限循环。那么,到底是哪个依赖出现了问题?...在大多数情况下,我们都是传入空数组 [] 作为 deps 参数,这样 useCallback 返回的就始终是同一函数,永远不会更新。...再来看看重渲染的情况: 重渲染的时候,再次调用 useCallback 同样返回给我们 f1 函数,并且这个函数还是指向同一块内存,从而使得 onClick 函数和上次渲染时真正做到了引用相等。

    1.5K30

    Python中的异步编程:深入理解和使用asyncio库

    事件循环是 asyncio 的核心,可以理解一个无限循环,我们可以把一些函数(通过 async 定义的函数,称为协程)注册到事件循环上,当满足事件发生的条件时,调用相应的协程函数。...协程是一种比线程更轻量级的存在,协程的调度完全由用户控制,协程之间的切换不涉及系统调用,开销极小。Python 中的协程并不是线程安全的,它们应该运行在同一个线程中。...如果我们直接调用异步函数,它只会返回一个 coroutine 对象,并不会执行函数。...我们需要使用 asyncio.run 来执行异步函数,或者在其他异步函数中使用 await 关键字进行调用:# 只会返回一个 coroutine 对象,并不会执行函数def main(): do_something...()loop.run_until_complete(main())如果我们需要同时执行多个异步函数,我们需要将异步函数定义 task。

    4.7K10

    java杂谈之各种锁

    乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。 悲观锁 悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。...4、可重入锁 可重入锁指的是该线程获取了该锁之后,可以无限次的进入该锁锁住的代码。...5、 自旋锁 自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗 CPU。...因此等待时间一定要有一定限度,如果自旋超过一定次数没有获得锁,就应该挂起线程 6、自适应锁 从JDK1.6之后引入了自适应锁,自适应锁意味着自旋时间不固定了,而是由前一次在同一个锁上的自旋时间及锁拥有者状态来决定...,如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程在执行中,,那么虚拟机就会认为这次自旋也很有可能再次成功,进而将它允许自旋等待持续更长时间,比如循环100次。

    59820

    很多工作10年都讲不清楚,Redis为什么这么快,5k字长文给你讲透!

    为什么Redis选择单线程? 上面回答了是单线程的,接着会问为啥采用单线程模型。 Redis的CPU通常不会成为性能瓶颈,因为通常情况下Redis要么受到内存限制,要么受到网络限制。...aeApiPoll:I/O多路复用API,基于epoll_wait/select/kevent等系统调用封装,监听读写事件以触发,然后进行处理,这是事件循环(Event Loop)中的核心函数,是事件驱动器运行的基础...多线程异步任务 如前所述,Redis在v4.0版本中引入了多线程来执行一些异步操作,主要用于非常耗时的命令。通过将这些命令的执行设置异步,可以避免阻塞单线程事件循环。...为了处理一些非常耗时的命令,Redis v4.0引入了多线程异步任务。这些异步任务在后台线程中执行,不会阻塞主线程的事件循环,从而提高了Redis的吞吐量和可用性。...那么为什么Redis现在引入了多线程呢?简单的事实是Redis的网络I/O瓶颈变得越来越明显。

    33910

    破解当前端出现“RangeError: Maximum call stack size exceeded”的N种思路

    前言 最近用谷歌浏览器调试时,控制台报了一个“Uncaught RangeError: Maximum call stack size exceeded”,其中文意思是超出最大调用堆栈大小,报错如下图所示...: 后边经过一番排查,终于把问题解决 问题出现的本质原因 1、前端存在无限循环调用 2、递归运算或者递归调用 3、函数不小心调用了它自己本身 ......排查的思路方向 因为出现这种问题的原因多种多样,没办法一招走天下,因此提供一些排查思路方向 1、排查js是否存在递归调用或者运算函数 2、引入冲突的js库 3、如果项目中有引入vue(或者iview...),注意检查调用的方法是不是同名了导致不停死循环 4、vue自定义组件是否存在父调用子,子调用父的行为 5、点击a标签后触发内部的组件的点击事件,导致点击事件冒泡至a标签(即a再次被点击),导致无限循环...[笔者的项目就是因为这个原因引起问题] 如果是因为a标签原因解决的办法有如下 1、把内嵌在a标签的组件挪到a标签外,但这样可能导致样式变样,或者点击不会出现手型,点击不会出现变色 2、阻止冒泡事件 3

    15.9K10
    领券