1
var any = _.some = _.any = function(obj, predicate, context) {
predicate || (predicate = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
each(obj, function(value, index, list) {
if (result || (result = predicate.call(context, value, index, list))) return breaker;
});
return !!result;
};
以上是在underscore.js中实现_.any方法。
在下面的行为谓词方法的结果进行测试时,为什么在这种情况下需要额外的检查?
if (result || (result = predicate.call(context, value, index, list)))
的result
是从一开始就false
,并且当result
变量是通过调用predicate
功能设置为true循环终止。所以在我看来,result
变量的第一个检查总是会评估为false
。为什么有这个变量的额外测试?
结果可以在each()回调中随时设置。如果结果不是虚假的,each()函数会尽早终止,就像真正的[] .some()那样,下划线将会关闭并放慢速度... – dandavis
@dandavis结果只能由predicate.call()设置,否? – Yeonho