gpt4 book ai didi

javascript - 使用 javascript 的无限定时器循环(没有 setInterval)?

转载 作者:可可西里 更新时间:2023-11-01 02:32:46 24 4
gpt4 key购买 nike

(一位 friend )要求我构建一个计时器(无限计时器,每秒写一行),但没有 setInterval

solved它与:

var i = 0;

function k(myId, cb)
{
setTimeout(function ()
{
console.log(myId);
cb();
}, 1000);
}

function go()
{
i++;
k(i, go);
}

go();

它正在运行。

问题是恐怕会有内存压力。它实际上创建了一个递归,并且在一段时间(一周左右)之后 - 该过程将消耗大量内存。 (堆栈永远不会被释放)

如何更改我的代码才能不消耗太多内存?

最佳答案

不是递归

它可能看起来像递归,但 setTimeout 不会创建递归。

setTimeout 的工作方式是立即返回。所以调用k立即结束并释放其堆栈。

当超时实际发生并且调用 go 时再次发生它不是从上次调用 k 开始的但来自全局范围*。

* 注意:我在这里没有使用 ECMAScript 规范中定义的范围的严格含义。我的意思是调用k就像你用普通的语言写的一样 <script></script>标记:也就是说,在任何其他函数调用之外。

关于您对关闭的担忧

在您的特定情况下,k 创建的闭包中实际包含的内容很少功能。唯一重要的闭包是对参数 cb 的引用和 myId .即便如此,它也只持续大约一秒钟:

 #1   function k(myId, cb) {
#2 setTimeout(function(){
#3 console.log(myId); // there is a closure here to myId
#4 cb(); // and another one for cb
 #5
/* But at this point in the function, setTimeout ends
* and as the function returns, there are no remaining
* references to either "cb" or "myId" accessible
* anywhere else. Which means that the GC can immediately
* free them (though in reality the GC may run a bit later)
*/
#6 }, 1000); // So one second is roughly the longest the closure lasts
}

可以更简单

我应该注意到您的代码相当复杂。它可以写得更简单,并且根本不使用闭包(减去全局变量 i),如果你只是这样写:

// Simpler, does exactly the same thing:
var i = 0;
function go () {
console.log(i);
i++;
setTimeout(go, 1000); // callback
}
go();

关于javascript - 使用 javascript 的无限定时器循环(没有 setInterval)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13506852/

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