为什么console.log()继续在这个循环中进行?

时间:2013-09-29 03:52:46

标签: javascript

我将变量'i'定义为等于2,然后说:如果'i'介于0和2之间,让函数'animate'运行。但是,如果我在JSFiddle(option-command-I)中打开控制台,则console.log()继续在0以下减少1!我是否在if语句中使用条件不正确?

var interval = window.setInterval(animate, 500);
var i = 2;
if (0 < i < 2) {
    function animate() {
        alert('run');
        i--;
        console.log(i);
    }
}

JSFiddle:http://jsfiddle.net/lpsternotes/RuLHn/

3 个答案:

答案 0 :(得分:4)

这里有两个问题。

首先,有:0<i<2。这将始终评估为true

为什么呢?你希望它的意思是“我在0和2之间”(可以写成0<i && i<2)。但对于JS编译器,它只是<运算符的两个实例。首先,评估0<i,得到truefalse;然后,将结果与<2进行比较 - 因此我们有true<2false<2。为了回答这个问题,JS必须将truefalse“强制转换”为整数。它将false视为0,将true视为1;由于这些都是<2,因此最终结果始终为true

其次,您的if语句的位置只会被检查一次:

if (0 < i < 2) {
    function animate() {

如果您仔细阅读代码,您将看到无法返回到此if语句上方的行,因为代码的唯一重复部分是重复运行{{1功能。要在每次运行函数时运行,animate需要位于if内,而不是相反。

答案 1 :(得分:3)

您需要在满足条件后清除间隔并移动if条件(请注意0 < i < 2需要拆分为2个与&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;功能

var interval = window.setInterval(animate, 500);
var i = 2;
function animate() {
    if (i > 0) {
        console.log('run');
        i--;
        console.log(i);
    }
    else{
        window.clearInterval(interval);
   }
}

答案 2 :(得分:1)

为什么不将if语句放入动画函数中?

var i = 2;
function animate () {
    if (i> 0 && i<2) {
        alert('run');   
        i--;
        console.log(i);
    } 
}

编辑:  1)你可能想要使用i&gt; 0&amp;&amp; i <2而不是0

2)不确定是否需要在满足条件后清除间隔。如果你能详细说明你的要求会更好。