传递给超时函数时小数点被删除了吗?

Decimal point removed when passed into a timeout function?

我知道浮点变量在处理 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); 

}

变量"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);  
 }

这是因为 'i' 在第二次警报中始终为 10。在 i 已经达到其最大值(在本例中为 10)后,您将代码执行到 setTimeOut(function(){....},1000)

您遇到了关闭问题。 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);
}

您的超时在 for 循环完成后触发...此时 i 已设置为 10,因此所有警报均正确,i/10 为 1 . 你应该使用闭包或类似的技术来获得你期望的结果。

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)
    );
}