2012-07-14 110 views
2

以下脚本输出1 2 3 4 5 6 7 ..我假设它会输出0 1 2 3 4 5 ...为什么在传递回调时,此对象调用函数的Javascript setInterval不计算内部参数?

事实上,在我的实际代码中,我相信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> 

谢谢,这是我的第一篇文章

+0

显示我的代码。 – corazza 2012-07-14 00:59:22

+0

对不起,刚添加了代码 – 2012-07-14 00:59:56

回答

1

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

obj1构造函数在构造之后不会显示数字,直到5毫秒。只有在此时调用回调函数,回调才会直接引用lostCnt - 而不是创建obj1实例时的保存副本。

所以你的假设是正确的,我认为这是很明显—传递给obj1构造直接引用lostCnt回调。

如果你想以不同的方式做到这一点,你可以这样做:

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

这不是Javascript的正确假设。请参阅[JavaScript闭包如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)以获取更多详细信息。 – 2012-07-14 01:06:30

+0

@DavidWitherspoon不,这个函数是在调用obj1构造函数的时候构建的,但是当它被写入时,它在**执行**时引用了'lostCnt'的值。 – Pointy 2012-07-14 01:07:19

相关问题