我想要一个我正在编写的函数来自动调用它自己。我希望能够通过第一次解析它来解析它自己调用的频率。然后它将在内部使用相同的值与JS setTimeout()函数以相同的频率重复调用自身。
所以你可以在下面的示例中看到我的内容:
INSERT
问题是这不起作用,因为从第二次运行开始,未评估解析的超时。控制台输出提供了这里发生的事情的线索:
频率:未定义
我如何才能实现这一目标,迄今为止没有任何帮助。
答案 0 :(得分:3)
请尝试使用Window setInterval() Method。另请参阅this answer和this answer以获取更多信息。
var autoInterval;
var elapsed = 0;
function myStartFunction(refreshFrequ) {
if (!autoInterval) {
autoInterval = setInterval(function() {
elapsed++;
document.getElementById("txt").innerHTML = refreshFrequ * elapsed + " elapsed.";
console.log("frequency interval: " + refreshFrequ + " x " + elapsed);
}, refreshFrequ);
}
}
function myStopFunction() {
if (autoInterval) {
clearInterval(autoInterval);
autoInterval = null;
elapsed = 0;
document.getElementById("txt").innerHTML = "Interval was reset.";
console.log("interval stopped");
}
}
myStartFunction(5000);

<p>The setInterval() method has started automatically.</p>
<button onclick="myStartFunction(1000)" title="Start with 1000 ms interval. Clicking this button while the event is active should not create a new interval instance.">Start</button> <button onclick="myStopFunction()" title="Click to stop and clear the interval instance.">Stop</button>
<p id="txt">0 elapsed.</p>
&#13;
编辑:虽然没有提及潜在的重复函数调用,但应考虑the other answer,尤其是在事件可以任意执行的情况下。强制执行if
语句是为了防止重复事件与原始实例相叠加;否则,每个额外执行的函数将导致一个唯一的实例,然后可以进一步创建不可阻挡的多个事件,所以我必须在信用到期时给予信用。感谢Tymek!
答案 1 :(得分:1)
您可能希望改为使用setInterval
。
var testFunction = (function () { // This will "build"/"enclose" our function
var handle = null; // ID of the interval
return function (freq) {
if (handle !== null) clearInterval(handle);
handle = setInterval(function() {
console.log("frequency: " + freq);
}, freq);
};
})();
如果你重新初始化间隔,你就不会创建它的另一个实例(有2个函数勾选)。
您可以在https://www.w3schools.com/jsref/met_win_setinterval.asp了解有关setInterval
的更多信息
以及有关JavaScript函数如何在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures