Подчеркивайте каждый, проверяя на {} возврат обратного вызова

Я изучал, как 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, так как он не тот же объект (поэтому цикл никогда не прерывается). В чем причина этого?

Ответы

Ответ 1

Они используют each внутренне, например. some. Поскольку some выполняет короткое замыкание, они могут each ломаться там, используя "секретный" объект, не подвергая эту функцию обычным пользователям. Они не выставляют функцию прерывания, потому что нативная функция этого не делает, либо (так что их прокладка как можно более родная). Если они это сделают, функция break будет доступна только в том случае, если нативная функция недоступна, что не особенно полезно.