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

10.1K20
  • 设置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.5K10

    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

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

    60410

    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.2K21

    【算法】答应我,今天一定要掌握什么是函数递归!!!

    : 递归就是重复的执行函数体中的代码 递归不能够无限制的重复,它会在运行到一定程度时终止 还没有接触过递归的朋友可能会有疑惑,这个递归怎么和循环这么像呢?...它和循环又和有何联系呢? 1.3 递归与迭代 我们直接说结论——递归和迭代都是重复同一种操作的编程方式。这里的迭代就是指的循环。...不过递归与迭代不同的是,递归不存在死递归,总是会有一个终止的方式,但是迭代却会出现死循环。为什么会这样呢?...,并不会消耗额外的内存空间,因此程序不会出现内存不够的情况; 所以不管是递归还是迭代,我们都必须防止出现栈溢出与死循环的情况发生。...在递归中我们还需要注意,当我们在设置结束条件时,并不能无限制的设置,从前面的测试中我们可以看到,这里最简单的递归仅可以在内存中自我调用4584次,也就是说当我们调用了4584次main函数后,此时栈区的空间是已经被申请完了

    5810

    并发模型与事件循环

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

    77120

    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

    【JavaEE】多线程编程引入——认识Thread类

    引入: 通过前面的学习,我们了解到现在主流的编程方式为,多进程编程和多线程编程 在java中并不推荐使用多进程编程这种方式,因为很多跟多进程编程有关的api,Java标准库中都没有提供。...api在用户空间内完成一些常规操作,这些操作可以视为“合法操作”并不会对软硬件造成什么潜在危害。...在前面我们学过,线程的引入是为了解决“进程频繁创建和销毁带来的资源浪费”这一问题的,同一个进程中,有第一个线程创建后,后面的线程创建所耗费的资源就会大大降低。...这里同样是如此,main函数作为这个进程中的主线程,第一个创建所耗费的资源是最多的,但是也是最先被打印的,后续while循环中,run第一次出现的次数才更多的 注:线程的创建也是需要耗费资源的,第一个线程最大...,后续的比较少,但不是没有 2:jconsole工具 查看线程信息的工具 代码出问题可以在这查看 3:sleep方法 (1)我们引入while循环达到多次实验的目次,sleep方法是为了避免打印过快而引入的

    6600

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

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

    1.6K30

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

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

    6.6K10

    java杂谈之各种锁

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

    60720
    领券