2014-01-20 3 views
4

В underscore.js, есть такой код:Какова важность выключателя в underscore.js?

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

, например, в "каждый" функции

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, length = obj.length; i < length; i++) { 
     if (iterator.call(context, obj[i], i, obj) === breaker) return; 
    } 
    } else { 
    var keys = _.keys(obj); 
    for (var i = 0, length = keys.length; i < length; i++) { 
     if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; 
    } 
    } 
}; 

Я не понимаю, зачем добавлять этот if(xxx === breaker) return;? Когда будет iterator.call(context, obj[keys[i]], keys[i], obj) === breaker?

+0

@lucuma, похоже, спасибо за вашу ссылку :) –

+0

@lucuma, еще раз спасибо за предоставленную ссылку, я нашел ответ, который я ищу :) –

ответ

1

с Annotated source code,

Establish the object that gets returned to break out of a loop iteration. 

это просто значение сторожевого и если функция возвращает итератор breaker, _.each вернется немедленно. Поскольку breaker не назначен ни одному другому объекту, ни один другой объект не может быть равен breaker (он сопоставляется с ===). Он используется внутри, _.every и _.any.

_.every

if (!(result = result && iterator.call(context, value, index, list))) return breaker; 

_.any

if (result || (result = iterator.call(context, value, index, list))) return breaker; 

Эти две функции возвращают breaker, так что _.each вырвется из итераций.

0

Если вы перечисляете в коде, вы увидите следующий код:

var breaker = {}; 

Так что проверка, если функция она звонит (iterator) возвращает пустой объект. Если это так, каждый «цикл» прерывается, и функция заканчивается.

1

Он используется в других _underscore помощников, как _.all(), _.every(), _.any() которые используют функцию _.each() Переберите коллекции, но вернуть breaker, когда они хотят остановить каждую петлю (т.е. они нашли элемент, который они искали и т.д.)

Смежные вопросы