当在javascript中使用闭包迭代时,如何继续使用for循环

使用underscore.js是否有办法打破每个如果一定条件满足?

_.each([1,2,3], function(value) { if (value == 2) { // continue 2 return false; } }); 

我确定在prototype.js中返回false是个诀窍

看起来你应该返回breaker ,这似乎不在范围内。 所以,在不修改_ ,你不能轻易地跳出迭代。 ===将确保返回{}不会导致循环中断; 你需要一个你没有的breaker的参考。

  // The cornerstone, an `each` implementation, aka `forEach`. // Handles objects implementing `forEach`, arrays, and raw objects. // Delegates to **ECMAScript 5**'s native `forEach` if available. var each = _.each = _.forEach = function(obj, iterator, context) { if (obj == null) return; if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context); } else if (_.isNumber(obj.length)) { for (var i = 0, l = obj.length; i < l; i++) { if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; } } else { for (var key in obj) { if (hasOwnProperty.call(obj, key)) { if (iterator.call(context, obj[key], key, obj) === breaker) return; } } } }; 

我不确定是否可以实际停止循环,但是可以使用布尔值来停止循环中的代码执行:

 var keep_going = true; _.each([1,2,3], function(value) { if(keep_going){ if (value == 2) { // continue 2 keep_going = false; } } }); 

你不能。 正如Stefan在上面所提到的,如果你的浏览器不支持Array.prototype.forEach(这是一个很长的一段时间),你可以返回breaker – 如果你有权访问它。 但不幸的是,你不这样做,因为在underscore.js库的闭包中定义了{}

不幸的是,JavaScript的行为是两个对象不相等,除非它们是完全相同的对象。 因此, ({}) === ({})为false,因此函数的返回值将不会通过与内部breakervariables的相等性检查。

所以,如果没有像上面发布的迂回方法,你不能像这样打破循环。 而且,根据MDC ,没有办法打破使用的每个本地forEach。

这可能是很好的。 .each不支持跳过。

你可以做的迂回的方式:

 var skip = false; _.each([1,2,3], function(value) { if (true === skip) { return; } if (value == 2) { skip = true; return false; } }); 

但我相信有一个更好的function。