2014-01-20 26 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()它通過收集使用​​功能循環,但返回breaker當他們想停止每個循環(即他們發現他們所尋找的元素等)

相關問題