Javascript - for循环只迭代一次?

时间:2015-08-17 16:41:00

标签: javascript jquery

我有一个 for 循环,但它会执行一次,应该执行两次。

$ appointmentments 变量保存来自ajax调用的返回数据。当我 console.log($ appointmentments.length)时,我得到两个是正确的,但迭代只发生一次,我无法弄清楚原因。

       for (var i = 0; i < $appointments.length; i+=1) {

          var rangeStart_hour = $appointments[i].timerange.substring(0, 2); 
          var rangeStart_minutes = $appointments[i].timerange.substring(3, 5); 
          var rangeEnd_hour = $appointments[i].timerange.substring(11, 13); 
          var rangeEnd_minutes = $appointments[i].timerange.substring(14, 16); 
          var rangeS = rangeStart_hour + rangeStart_minutes; 
          var rangeE = rangeEnd_hour + rangeEnd_minutes; 
          var rangeStart = parseInt(rangeS); 
          var rangeEnd = parseInt(rangeE); 
          var range=0;

          if(parseInt(rangeStart_hour) == 12){
            if(parseInt(rangeStart_minutes) == 0){
              range = rangeEnd - 0; 
            }else{
              range = rangeEnd - (parseInt(rangeStart_minutes)+20); 
            }
          }else{
            if(parseInt(rangeStart_minutes) == 30 && parseInt(rangeEnd_minutes) == 0){
              // if start time 1:30 ,end time 3:00
              range = (rangeEnd - (rangeStart + 20)); // 300 - 150 = 150
            }else if(parseInt(rangeStart_minutes) == 0 && parseInt(rangeEnd_minutes) == 30){
              range = ((rangeEnd+20) - rangeStart);
            }else{
              range = rangeEnd - rangeStart;
            }
          }

          console.log(range);

          for(var i=1; i<(range/50); i++){
            $("a[data-time='"+(rangeStart)+"']").addClass('time');
            rangeStart += 50;
          };
        };

4 个答案:

答案 0 :(得分:5)

如果更改

,则在第二个for循环中重新初始化变量i
for(var i=1; i<(range/50); i++){
    $("a[data-time='"+(rangeStart)+"']").addClass('time');
    rangeStart += 50;
};

使用另一个变量,比如j它应该可以正常工作。

答案 1 :(得分:5)

这种结构似乎是一个坏主意:

for (var i = 0; i < $appointments.length; i += 1) {
    //...
    for (var i = 1; i < (range/50); i++){
        //...
    }
}

可能想为嵌套循环计数器使用不同的变量名。

答案 2 :(得分:1)

重要提示: JavaScript没有块范围。使用块引入的变量的范围限定为包含函数或脚本,并且设置它们的效果将持续超出块本身。换句话说,块语句不引入范围。虽然“独立”块是有效的语法,但您不希望在JavaScript中使用独立块,因为如果您认为它们在C或Java中执行类似此类块的操作,则它们不会按照您的想法执行操作。

在您的代码中,“i”变量使用了两次,因此第二次初始化值为第一次 for 循环的递增。这就是为什么,条件在第一个 for 循环和循环中失败正在终止。在第二个或第一个中更改变量名称循环然后它将按预期工作

答案 3 :(得分:1)

在JavaScript中,变量的范围是函数范围。这意味着所有变量声明都被提升到函数的顶部。 所以,在你的情况下:

for (var i = 0; i < $appointments.length; i += 1) {
    ...
    for (var i = 1; i < (range/50); i++){ 
        ...
    };
};

等于

var i; // two variables with the same name are hoisted as the same variable.

for (i = 0; i < $appointments.length; i += 1) {
    ...
    for (i = 1; i < (range/50); i++){ 
        ...
    };
};

所以,在第二个循环结束时,&#34; i&#34;将大于或等于范围/ 50。如果此值不小于$ appointmentments.length,则第一个循环将在第一轮之后终止。