2015-02-09 50 views
1

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

} 
+1

这些变化'的console.log()',而不是'警报()',所以你可以看到他们被称为什么顺序更好的历史,所以你不要't垃圾'alert()'s – DLeh 2015-02-09 19:03:28

+0

你不会丢失小数点,你不会理解闭包是如何工作的。 – 2015-02-09 19:04:56

回答

3

变量“i”总是为“10”,因为超时将在for循环后调用。所以你总是得到整数,因为你是devide 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); 
} 
0

这是因为“我”始终是10第二警报。在这种情况下,我已达到其最大值10之后,将代码执行到setTimeOut(function(){....},1000)

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

因为setTimeout可以带参数,为什么我们应该用另一个函数来隔离它? – 2015-02-09 19:12:49

+1

这是真的,但它是特定于setTimeout。还有其他的地方,这些封闭的东西可以咬你,比如建立动态html,其中没有使用setTimeout。 – Malk 2015-02-09 19:20:39

1

你超时了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) 
 
    ); 
 
}

+0

因为setTimeout可以带参数,为什么我们应该用另一个函数来隔离它? – 2015-02-09 19:14:00