我有一个 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;
};
};
答案 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,则第一个循环将在第一轮之后终止。