2012-07-22 3 views
14

ich untersuchen, wie Underscore.js ihre implementiert each/forEachStrich ist jede Prüfung für {} return von Rückruf

//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) 

Grundsätzlich ist es den Rückruf für jedes Element in dem Objekt/Array ausgeführt wird. Aber das ist wie verwirrt ich

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

Von dem, was ich verstehe, wenn der Rückruf ein Objekt zurückgibt, wird die Schleife bricht, aber ... Warum es zu breaker zu vergleichen, die in dem Unterstrich-Modul ein internes Objekt ist?. Wird die ganze Zeit nicht false ausgewertet, auch wenn der Callback ein Objekt zurückgibt, ist es immer false, da es nicht das gleiche Objekt ist (daher bricht die Schleife niemals). Was ist der Grund dafür?

+0

Ein weiterer Trick, den ich mag, wenn Sie den Breaker-Objekten Werte hinzufügen müssen, ist stattdessen eine Breaker-Klasse erstellen und instanceof Tests verwenden. – hugomg

Antwort

13

Sie verwenden each intern für z.B. some. Da some einen Kurzschluss verursacht, können sie each mit dem "secret" -Objekt unterbrechen, ohne diese Funktion für normale Benutzer verfügbar zu machen. Sie stellen das Umbruchmerkmal nicht zur Verfügung, weil die native Funktion dies auch nicht tut (so ist ihre Unterlegscheibe so nativ wie möglich). Wenn dies der Fall wäre, wäre die Unterbrechungsfunktion nur verfügbar, wenn die native Funktion nicht verfügbar ist, was nicht besonders hilfreich ist.