强调的每个检查{}回报回调(underscore's each checking for {

2019-06-26 10:45发布

我正在研究UnderscoreJS如何实现他们的each / forEach

//somewhere up top:
var breaker = {};

//then the each function
var each = _.each = _.forEach = function (obj, iterator, context) {
    if (obj == null) return;
    if (nativeForEach && obj.forEach === nativeForEach) {
        obj.forEach(iterator, context);
    } else if (obj.length === +obj.length) {
        for (var i = 0, l = obj.length; i < l; i++) {
            if (iterator.call(context, obj[i], i, obj) === breaker) return;
        }
    } else {
        for (var key in obj) {
            if (_.has(obj, key)) {
                if (iterator.call(context, obj[key], key, obj) === breaker) return;
            }
        }
    }
};

//iterator = callback
//context  = optional third parameter of each to provide context in the callback
//obj      = the list
//key      = key of the object (i for index when an array)

基本上,它是执行对所述对象/阵列中的每个项中的回调。 但是,这就像让我困惑

if (iterator.call(context, obj[key], key, obj) === breaker) return;

据我了解,如果回调返回一个对象,循环中断,但是...... 为什么这是比较breaker是下划线模块中的内部对象? 。 没有它评估为false ,因为所有的时间,即使回调不返回一个对象,它始终是false ,因为它不是同一个对象(因此循环永远不会打破 )。 什么是这背后的原因是什么?

Answer 1:

他们用each内部的例如some 。 由于some不短路,也可以有each使用的“秘密”对象破那里,而不是公开此功能对于普通用户。 他们不暴露休息的功能,因为本机的功能没有做到这一点,无论是(所以他们垫片是类天然越好)。 如果他们这么做,休息功能将只可如果本地函数是unavailble,这是不是特别有帮助。



文章来源: underscore's each checking for {} return of callback