循环的javascript不是递增的

循环的javascript不是递增的,javascript,for-loop,Javascript,For Loop,我试图使用for循环来验证用户的输入,这就是我得到的代码 function Valid() { objfieldid = ["userMail", "userCont"] objboxid = ["cancelMail", "cancelCont"] return objfieldid.every(callnonvalid) } function callnonvalid(id) { var valid = false var objlength = objfieldid.l

我试图使用for循环来验证用户的输入,这就是我得到的代码

function Valid() {
  objfieldid = ["userMail", "userCont"]
  objboxid = ["cancelMail", "cancelCont"]
  return objfieldid.every(callnonvalid)
}
function callnonvalid(id) {
  var valid = false
  var objlength = objfieldid.length
  objlength--;
  for (var i = objlength; i >= 0; i--){
    var cobj = document.getElementById(objboxid[i]).checked;
    if (document.getElementById(id).value != "" ){
      var obj = document.getElementById(id).value;
    } else if (cobj == true) {
      alert(i); //return 1, 1
      return true
    } else {
      return false
    }
  }
}
如您所见,在代码中,for循环运行了两次。但是i变量保持不变。为什么会发生这种情况

顺便说一句,我确实读过关于闭包的不同材料,我确信没有出现闭包问题


编辑:伙计们,请注意,我确实注意到数组是以零为基的,我确实减去了一个objlength

因为数组
objboxida[]
只有两个元素,所以第一次通过循环
objboxida[2]
将尝试获取超出边界的数组索引

你的意思可能是:

for (var i = objlength; i > 0; i--){
  var cobj = document.getElementById(objboxid[i-1]).checked;
或许

for (var i = objlength-1; i >= 0; i--){
  var cobj = document.getElementById(objboxid[i]).checked;

我不确定你为什么要在循环中递减,因为性能增益将是无穷小的(甚至可能更慢,例如在Chrome/V8中),并且以相反的顺序工作可能会让人更加困惑,但这是你的选择,我不知道你在做什么来判断

无论哪种方式,我认为您都不希望在循环开始之前像现在这样减小
objlength
。循环的全部要点是处理循环的条件语句中的递增/递减

如果要将
if/else if/else
语句移动到一个closed-over函数中并递归执行它,则只能像这样手动递减,从闭包中递减
objlength
。这是可行的,但对于你正在做的事情来说,这是不必要的复杂,重写整个过程也不会有任何好处

因此,坚持循环方法,或许可以尝试以下任一方法:

function Valid() {
  objfieldid = ["userMail", "userCont"];
  objboxid = ["cancelMail", "cancelCont"];
  return objfieldid.every(callnonvalid);
}

function callnonvalid(id) {
  var valid = false;
  var objlength = objfieldid.length;

  for(var i = 0; i < objlength; i++){
    var cobj = document.getElementById(objboxid[i]).checked;
    if (document.getElementById(id).value != "" ){
      var obj = document.getElementById(id).value;
    } else if (cobj == true) {
      alert(i); 
      return true;
    } else {
      return false;
    }
  }
}

仔细检查代码后发现了错误。我犯的错误是,我不应该使用out的返回值,因为这会停止函数的工作,但是,
数组。每个
调用函数两次,使I不减少

请修复代码缩进。我刚刚编辑了问题,等待同行审阅。你是什么意思“i变量保持不变”?每个周期递减一次。检查控制台。会出现错误;提示:数组的索引是零basedWell,我的意思是i变量保持不变,我的意思是每个周期不递减一次。如果使用
objboxide[i-1]
,而不是
,会发生什么(var i=objlength;i>=0;i--){
,我们将
=
更改为
?这样,永远不会达到
i=0
的值,也不会引用负索引。循环第一次运行objboxida[1],请注意,对于objlength@Andreas谢谢。本打算在第一个示例中更新for循环,但忘记了。更正。
function Valid() {
  objfieldid = ["userMail", "userCont"];
  objboxid = ["cancelMail", "cancelCont"];
  return objfieldid.every(callnonvalid);
}

function callnonvalid(id) {
  var valid = false;
  var i = objfieldid.length;

  while(i--){
    var cobj = document.getElementById(objboxid[i]).checked;
    if (document.getElementById(id).value != "" ){
      var obj = document.getElementById(id).value;
    } else if (cobj == true) {
      alert(i);
      return true;
    } else {
      return false;
    }
  }
}