在下面的代码中,为什么它可以创建可能的无限递归?为什么内存使用率不断提高,以及如何解决呢?
function waitForKeyElements (selectorTxt, actionFunction) {
if (getElementByXPath(selectorTxt) == null) {
var timeControl = setInterval (function () {
waitForKeyElements (selectorTxt, actionFunction);
},
300
);
} else {
clearInterval (timeControl);
actionFunction();
}
}
最佳答案
变量timeControl
对于函数waitForKeyElements()
的每次调用都是本地的-即,您设置的timeControl
不会是您清除的timeControl
。换句话说,以setInterval
开头的计时器永远不会清除。
将其移出函数应可解决该问题。
即
var timeControl = -1;
function waitForKeyElements (selectorTxt, actionFunction) {
if (getElementByXPath(selectorTxt) == null) {
timeControl = setInterval (function () {
waitForKeyElements (selectorTxt, actionFunction);
},
300
);
} else {
if(timeControl !== -1) clearInterval (timeControl);
actionFunction();
}
}
另外,正如用户Prinzhorn在评论中指出的那样,每次调用setInterval启动计时器肯定很麻烦。您实际上应该只是在执行setTimeout来确保事情不会失控。