js表格间距为0怎么调 js如何调用时钟间隔为10分钟?
js如何调用时钟间隔为10分钟?
通过设置定时器s
JS中循环和闭包如何理解?
提问者没有附上代码。根据描述,我猜代码应该是这样的:
for (var i 1 i lt 6 i)
{
setTimeout(function(){ console . log(I)},i * 1000)
}
这个循环每秒将输出6,所以让 s分析一下这段代码:初始I值为1,setTimeout会设置一个1*1000毫秒的定时器。在JS引擎中,定时器机制是将代码函数(){console.log(i)}放入队列中,等待触发器触发执行。但是循环代码的执行还是在初始的JS线程中,没有等待下一个循环马上执行,所以从2*1000到5*1000的5个函数都推了进来,几乎是省时的(5个周期对于现在的CPU来说基本是0毫秒)。所以从现在开始,该功能将每1、2、3、4和5秒执行一次。在我们看来,1秒钟就输出一次我。
接下来,让我们 让我们看看为什么输出5次6而不是1-5。然后,上面的过程还是在JS线程里。我按下定时器功能后,还是会被执行。此时I的值为6,进入循环体判断ilt6失效,循环结束。JS线程结束。
在1000毫秒的触发器被触发后,JS解释器被传入code function(){console.log(i)},I变量对于这个函数块是未定义的。解释器开始从上面的块代码中搜索变量I。在这种情况下,只有两层。函数的上层是JS环境的顶层,在global中找到变量I,其值为6,因此控制台输出6;接下来的四个触发器触发原理是一样的,所以6输出五次,间隔1秒。
为了加深我们的理解,让 让我们稍微修改一下代码:
for (var i 1 i lt 6 i)
{
setTimeout((function(){ console . log(I)})(),i * 1000)
}
结果是一个12345的瞬时输出,因为(sourceCodeBlock)()的行为是一个立即执行行为,即在第一个JS循环线程中,sourceCodeBlock每循环执行一次,它的上一个块就是循环体,循环体中的I变量就是当前循环中I的值。SetTimeout只是将这个闭包块执行的结果推入定时器队列,而这个执行当触发器被触发时,行结果在JS运行时环境中既不是函数类型也不是表达式类型,这没有意义,将在引擎解释阶段进行优化。所以在接下来的5秒钟里,浏览器没有。;不要做任何事。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。