jquery每个循环返回false而不是结束函数

我有一个函数,它获得一个点分隔的字符串并将其解析为数组。 我想循环这些数组元素并检查一个大于255的值并返回false,如果不是继续执行函数语句并返回true作为函数结束。 但它永远不会停止循环..并始终返回true。

这是代码:

checkipAddress = function(value){//instance value: 999.999.999.999 result:true debugger var array = value.split('.'); $.each(array, function(index,val){ debugger if(parseInt(val)>255) return false; // it should end the loop and exit function with return false. }); return true; } 

从一个函数返回并不会神奇地使一个函数调用它,更不用说使用特定的返回值。

如果要这样做,则必须设置外部函数将使用的变量:

 checkipAddress = function(value){ var rv = true; // <=== Default return value var array = value.split('.'); $.each(array, function(index,val){ if(parseInt(val)>255) return rv = false; // <=== Assigns false to `rv` and returns it }); return rv; // <=== Use rv here } 

旁注:您的函数将很乐意允许IP字符串,如"0.-234343.-1.0""1foo.2foo.3foo.4foo" 。 你可能会考虑:

 checkipAddress = function(value){ var rv = true; // <=== Default return value var array = value.split('.'); $.each(array, function(index,str){ str = $.trim(str); var val = +str; if(!str || val < 0 || val > 255) return rv = false; // <=== Assigns false to `rv` and returns it }); return rv; // <=== Use rv here } 

这样做会好一些,但它也不会检查IP中是否有四个部分,并且允许使用"1.1e2.3.4" (指数表示法)之类的值。 当然,所有这一切都是针对IPv4的,而我们正在进入IPv6世界......

但是,坚持使用IPv4,如果您的目标是确保它是正常forms的四部分IPv4地址,那么我会为正则表达式做好准备:

 checkipAddress = function(value){ var rv; var match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(value); var n, part; if (match) { rv = true; for (n = 1; rv && n < 5; ++n) { part = +match[n]; // We know it's not blank from the regex if (part > 255) { // We know it's not negative or fractional from the regex rv = false; } } } else { rv = false; } return rv; } 

或者在现代浏览器上(或使用一个像样的Array#every垫片):

 checkipAddress = function(value){ var match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(value); rv = !match ? false : Array.prototype.slice.call(match, 1).every(function(entry) { // We know it's not blank, negative, or fractional from the regex return +entry <= 255; }); return rv; }