正如 advncd 指出的那样,计时器被执行并在堆栈上添加更多数据。对发生的事情有一个概念性的看法:
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
// call the setTimeout.function
var a = 123;
...etc...
因此,每次a
在堆栈上分配一个新变量时,堆栈就会永远增长。
然而,advncd 没有提到的是你有一个 setInterval() 函数来做你需要做的事情:一遍又一遍地调用相同的函数。现在您仍然有“内存泄漏”,但只有初始化参数泄漏(即每次计时器超时时它都不会增长。)
所以从概念上讲,调用是平坦的,您可以避免泄漏:
a = 123;
// call the setTimeout.function
// call the setTimeout.function
// call the setTimeout.function
// call the setTimeout.function
// call the setTimeout.function
// call the setTimeout.function
// call the setTimeout.function
...etc...