Я читал исходный код библиотеки Underscore и наткнулся на это:
_.iteratee = builtinIteratee = function(value, context) {
return cb(value, context, Infinity);
};
Что значит иметь Infinity
в качестве параметра?
Редактировать:
Извините, вот cb
и optimizeCb
. Они преобразуют обратные вызовы в соответствующие итерации.
var optimizeCb = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount) {
case 1: return function(value) {
return func.call(context, value);
};
// The 2-parameter case has been omitted only because no current consumers
// made use of it.
case null:
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result — either 'identity',
// an arbitrary callback, a property matcher, or a property accessor.
var cb = function(value, context, argCount) {
if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
if (value == null) return _.identity;
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
return _.property(value);
};
Infinity
интерпретируется как число. В этом случае источник приводит сюда:
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
var optimizeCb = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
// The 2-argument case is omitted because were not using it.
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
Обратите внимание, что Infinity
передается параметру argCount
. Оператор switch/case завершает работу и возвращает функцию, которая просто применит контекст и аргументы к функции обратного вызова. Использование Infinity
похоже, обеспечивает провал.
builtInIteratee
из присваивания, и теперь этот пользователь настраивается.
Это означает, что параметр больше всех остальных чисел для всех целей и целей:
Из MDN:
Начальное значение Infinity - Number.POSITIVE_INFINITY. Значение Infinity (положительная бесконечность) больше любого другого числа. Математически это значение ведет себя так же, как бесконечность; например, любое положительное число, умноженное на бесконечность, равно бесконечности, а любое число, деленное на бесконечность, равно 0.
cb()
?cb
(который вы не показали) будет вызываться с третьим аргументом, являющимсяInfinity
... независимо от того, чтоcb
(я уже говорил, вы не показывали этого) делает сInfinity
все, что ему нужно делать сInfinity