14
的我正在研究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
,因爲它不是同一個對象(因此循環從不會中斷)。這背後的原因是什麼?
我喜歡的另一個技巧是,如果您需要爲斷路器對象添加值,則需要創建斷路器類並使用instanceof測試。 – hugomg 2012-07-22 13:52:42