信息,这里不在赘述。为什么只有在len大于1时才进行处理呢?因为参数为1时,就不需要进行下一步验证了。递归处理在什么时候进行呢?仔细想想,只有在初始值与结束值相等时才需要,明白了这些,我们就很容易构建我们的验证函数了。
var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10); if(diff <0 ){ alert(arguments[0].error); return false; }else if(diff == 0){ return len > 1 ? arguments.callee.apply(this,args) : true; }else{ return true; }
上面的代码中,arguments.callee是函数自身,关于apply的用法可以在web查找相关资料。
function compare(){ var len = arguments.length; if(len > 1){ var args = Array.prototype.slice.call(arguments); args.shift(); //将第一个参数移除,余下的用作递归处理的参数 } var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10); if(diff <0 ){ alert(arguments[0].error); return false; }else if(diff == 0){ return len > 1 ? arguments.callee.apply(this,args) : true; }else{ return true; } }
到此验证函数已经完成,但需要注意的是:
- 虽然没有确定参数的个数,但参数的顺序还是重要的,因为前一个参数的验证结果决定了下一个参数的验证是否继续;
- parseInt()函数的第二个参数10不要忽略。如果忽略,当遇到以0开始的数值(如07、08)时将会按八进制进行处理。
到此已经结束,看看 示例 。有时候,我们不想以alert的方式显示错误信息,我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始,取得处理函数,如:
var func = arguments[len - 1]; if(typeof func == ''function''){ func(arguments[0]); }
所以,最终的处理函数是这样的:
function compare(){ var len = arguments.length; var func = arguments[len - 1]; if(len > 1){ var args = Array.prototype.slice.call(arguments); args.shift(); //将第一个参数移除,余下的用作递归处理的参数 } var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10); if(diff <0 ){ (typeof func == ''function'') ? func(arguments[0].error) : alert(arguments[0].error); return false; }else if(diff == 0){ return len > 1 ? arguments.callee.apply(this,args) : true; }else{ return true; } }
|