为什么setInterval调用带有随机参数的函数?

时间:2020-03-05 18:59:39  来源:igfitidea点击:

所以,我看到一个奇怪的问题。如果我有功能

// counter wraps around to beginning eventually, omitted for clarity.
var counter; 
cycleCharts(chartId) {
    // chartId should be undefined when called from setInterval
    console.log('chartId: ' + chartId);
    if(typeof chartId == 'undefined' || chartId < 0) {
        next = counter++;
    }
    else {
        next = chartId;
    }
    // ... do stuff to display the next chart
}

可以通过用户操作显式调用此函数,在这种情况下,会将" chartId"作为参数传入,并显示选定的图表;或者它可以处于自动播放模式,在这种情况下,它由一个setInterval调用,该setInterval由以下内容初始化:

var cycleId = setInterval(cycleCharts, 10000);

奇怪的是,即使从setInterval调用它,我实际上仍在看到cycleCharts()得到chartId参数! setInterval甚至没有传递给cycleCharts函数的任何参数,因此,对于从setInterval中调用cycleCharts时为什么未定义chartId感到困惑。

解决方案

回答

setInterval是为cycleCharts馈送实际的时序数据(因此可以计算出它的实际运行时间,并用于产生较小的响应,大多数情况下在动画中很实用)

你要

var cycleId = setInterval(function(){ cycleCharts(); }, 10000);

(此行为可能未标准化,因此不要过于依赖它)

回答

var cycleId = setInterval(cycleCharts,10000,4242);

从第三个参数开始,它们被传递到函数中,因此在我的示例中,我们将4242作为chartId发送。我知道这可能不是我们提出的问题的答案,但可能是问题的解决方案?我认为在传递/调用该方法时,它从堆栈上的任何内容获取的值都是随机的。

回答

它告诉我们回调被延迟了几毫秒。