当在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,因此函数的返回值将不会通过与内部breaker
variables的相等性检查。
所以,如果没有像上面发布的迂回方法,你不能像这样打破循环。 而且,根据MDC ,没有办法打破使用的每个本地forEach。
这可能是很好的。 .each
不支持跳过。
你可以做的迂回的方式:
var skip = false; _.each([1,2,3], function(value) { if (true === skip) { return; } if (value == 2) { skip = true; return false; } });
但我相信有一个更好的function。
- 是否有可能使用因子束的browserify-css?
- Node.js / V8中没有实际的浮点types?
- 使用npm作为任务运行者/构build工具 – 有一些cli模块出现问题
- Socket.io 1.0 + express 4.2 =没有套接字连接
- passport.js不会将用户传递给会话
- 节点path.relative返回不正确的path
- 用户点击后退button,而会话仍然被authentication,并被redirect到node.js中的login页面
- events.js:160扔呃; //未处理“错误”事件 – 错误:spawn npm ENOENT
- Mongoose查询callback不会在NodeJS cronjob中调用