gpt4 book ai didi

JavaScript 设置超时

转载 作者:行者123 更新时间:2023-11-28 16:12:30 25 4
gpt4 key购买 nike

我很难理解 JavaScript 中 setTimer 方法背后的逻辑。

 <html><head>
<script>
function Timer () {
var today = new Date();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();

document.getElementById('show').innerHTML=h+":"+m+":"+s;
t = setTimeout("Timer()", 1000);
}
</script>
</head>

<body onload="Timer()">
<div id="show"></div>
</body></html>

setTimeout 用于延迟函数/方法的执行。那么为什么它被用在实时时钟中呢?

t = setTimeout("Timer()", 1000);

这部分令人困惑。

最佳答案

在经过一段时间后,时钟会递归地调用自身。

在JS中制作实时时钟是不可能的。由于 JS 引擎的工作方式,如果您输入 Timer在一个循环中,要运行无限长的时间,您永远不会在屏幕上看到时间更新(因为直到函数完成并且程序中存在间隙之前,更改不会绘制到窗口)。另外,在这个无限循环中,不可能对页面做任何其他事情(甚至关闭它),因为 JS 一次只能做一件事,所以它无法监听用户的任何点击,直到它被点击为止。完成这个循环.......

这就是setTimeout是为了。

Timer是充当时钟的函数。里面Timer函数,最后当所有工作完成后,它会告诉 setTimeout等待 1 秒 (1000ms),然后调用名为 Timer 的函数.

Timer恰好是同一个功能。但是setTimeout不知道,也不关心。

t在这种情况下基本上是无用的。 setTimeout将返回一个号码——就像在医生办公室取号码一样。如果在执行此操作之前您决定退出,可以调用 clearTimeout(t);并且它将跳过该调用(在这种情况下,它将停止调用时钟)。

这里有一些不好的做法,我认为我应该提及,以便您可以尽量不要在自己的实践中复制它们。

第一:通行证 setTimeout对函数的引用,而不是字符串...

var runThisFunction = function () { console.log("It's the future!"); },
time_to_wait = 250;

// DON'T DO THIS
setTimeout( "runThisFunction()", 250 );


// DO THIS
setTimeout( runThisFunction, 250 );

不同之处在于 setTimeout将通过 eval 运行该字符串,这可能是一个巨大的安全问题,具体取决于您想要做什么。

第二个问题是设置一个随机全局变量 t ... ...并希望以此作为解决方案。首先,几年后,JS 引擎将开始对那些做这些事情的人大喊大叫。其次,这是一个巨大的漏洞,因为该页面上任何应用程序的任何部分都可能会覆盖 t ,或者您可以依赖 t在脚本的其他地方,但每 1000 毫秒,它就会被写入一个新数字。

相反,他们可能应该使用 Timer.start();Timer.stop();设置。

关于JavaScript 设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12445106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com