Javascript for循环不是递增的
javascript for loop is not incrementing
我试图使用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 1。
仔细检查代码后发现错误。我犯的错误是,我不应该使用输出的返回,因为这会阻止函数工作,然而,array.every
调用函数两次,这使得I不减少
我不确定为什么你在循环中递减,因为性能增益将是无穷小的(它甚至可能更慢,例如在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;
}
}
}
因为数组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;
相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记