首页
学习
活动
专区
工具
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……一直这样无限循环下去,而且不会爆内存。

10K20
  • 设置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 类型检查,以及表示容器对象的无限循环 ...

    2.1K10

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

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

    5.6K20

    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

    字节面试:如何实现准时的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。...再看看额外代码的引入效果。 ...

    54510

    并发模型与事件循环

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

    76420

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

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

    1.6K30

    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

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

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

    5.9K10

    java杂谈之各种锁

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

    60420

    很多工作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瓶颈变得越来越明显。

    40710

    Node.js的事件循环

    介绍 事件循环是了解 Node.js 最重要的方面之一。 为什么这么重要?...只需要注意如何编写代码,并避免任何可能阻塞线程的事情,例如同步的网络调用无限循环。...通常,在大多数浏览器中,每个浏览器选项卡都有一个事件循环,以使每个进程都隔离开,并避免使用无限循环或繁重的处理来阻止整个浏览器的网页。 该环境管理多个并发的事件循环,例如处理 API 调用。...此时,调用堆栈如下所示: 每次迭代中的事件循环都会查看调用堆栈中是否有东西并执行它直到调用堆栈空: 入队函数执行 上面的示例看起来很正常,没有什么特别的:JavaScript 查找要执行的东西,并按顺序运行它们...此时,调用堆栈如下所示: 这是程序中所有函数的执行顺序: 为什么会这样呢? 消息队列 当调用 setTimeout() 时,浏览器或 Node.js 会启动定时器。

    2.7K20
    领券