javascript for循环不会递增

时间:2016-10-30 14:27:11

标签: 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.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的一个。

3 个答案:

答案 0 :(得分:0)

因为数组objboxid[]只有两个元素,所以第一次通过循环objboxid[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;

答案 1 :(得分:0)

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

无论哪种方式,我认为你不想在循环开始之前递减objlength,就像现在这样做。循环的重点是处理循环的条件语句中的递增/递减。

如果要将if/else if/else语句移动到关闭的函数并递归执行,从闭包内递减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;
    }
  }
}

或者,如果您想减少,请使用while代替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;
    }
  }
}

答案 2 :(得分:0)

仔细检查代码后发现错误。我犯的错误是我不应该使用返回,因为这会阻止函数工作,但array.every调用函数两次使i不减少