传递到超时函数时删除小数点?

时间:2015-02-09 19:01:37

标签: javascript math floating-point settimeout

我知道浮点变量在处理0.1,0.2,0.3等时需要解决..但这似乎不寻常?

for(var i=0;i<10;i=i+1){

  console.log("before timeout" + i/10); //returns 0.1 0.2 0.3 etc

  setTimeout(function(){
    console.log("after timeout" + i/10); //returns 1 1 1 etc
  },1000); 

}

4 个答案:

答案 0 :(得分:3)

变量“i”始终为“10”,因为超时将在for循环后调用。所以你总是得到整数,因为你把它分成10个

为了你自己的利益这样做:)

for(var i=0;i<10;i=i+1){
  console.log("before timeout" + i/10); 

    setTimeout(function(i){
       console.log("after timeout" + i/10); 
     },1000, i);  
 }

答案 1 :(得分:1)

你有一个关闭问题。 i将始终为10,因为setTimeouts在循环完成后解析。您可以通过将i传递给立即执行的函数来隔离for(var i=0;i<10;i=i+1){ console.log("before timeout" + i/10); (function(i){ setTimeout(function(){ console.log("after timeout" + i/10); },1000); })(i); }

{{1}}

答案 2 :(得分:1)

for循环完成后,您的超时时间已开始...此时i已设置为10,因此所有提醒都正确,i/10为1。应该使用闭包或类似的技术来获得你期望的结果。

&#13;
&#13;
for (var i = 0; i < 10; i = i + 1) {

  alert("before timeout" + i / 10); //returns 0.1 0.2 0.3 etc

  setTimeout(
    (function(j) { 
      return function() {
          alert("after timeout" + j / 10); //returns 1 1 1 etc
      }
    })(i)
    );
}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

这是因为&#39; i&#39;在第二个警报中始终为10。在我已达到其最大值(在这种情况下为10)后,您可以将代码执行到setTimeOut(function(){....},1000)