在下面的代码中,为什么它可以创建可能的无限递归?为什么内存使用率不断提高,以及如何解决呢?

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来确保事情不会失控。

09-03 17:20