为什么这个带有对象调用函数的Javascript setInterval在传入回调时不计算内部参数

Why is this Javascript setInterval with object calling function not evaluating the inner parameter when passing in a callback?

本文关键字:回调 参数 内部 计算 setInterval Javascript 对象 函数 调用 为什么      更新时间:2023-09-26

下面的脚本输出1 2 3 4 5 6 7.我假设它会输出0 1 2 3 5。。。

事实上,在我的实际代码中,我相信print(lostCnt)总是连接到最近的(就像全局的)最后计数更新。为什么会这样?我该怎么做才能让它保持实际的cnt,同时限制我不能修改obj1中的任何代码。

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function obj1(parameter, callback){
    setTimeout(callback, parameter);
}
function caller(){
    function miscFunction(cnt){
        document.getElementById("main").appendChild(document.createTextNode(cnt));
    }
    var lostCnt = 0;
    setInterval(
        function(){
            new obj1(5, 
                function(){
                    miscFunction(lostCnt);
                });
           lostCnt++;
        },5000
    );
}   
</script>

</head>
<body onload="caller();">
<div id="main">
</div>
</body>
</html>

谢谢,这是我第一次发布

lostCnt++在第一次调用miscFunction()之前执行。

obj1构造函数在构造后5毫秒才会显示数字。只有在这一点上,回调才会被调用,并且回调直接引用lostCnt,而不是创建obj1实例时保存的副本。

所以你的假设是正确的,我认为这是非常明显的;传递给CCD_ 6构造函数的回调是直接引用CCD_。

如果你想做不同的事情,你可以这样做:

setInterval(
    function(){
        new obj1(5, 
          function(savedLostCnt) {
            return function(){
                miscFunction(savedLostCnt);
            };
          }(lostCnt));
        lostCnt++;
    },5000
);