В замечательной библиотеке Underscore.js Джереми Ашкенаса я попытался понять одну вещь об исходном файле. Я не понимаю этого:
var slice = Array.prototype.slice;
args = slice.call(arguments, 2);
Так что:
args = Array.prototype.slice.call(arguments, 2);
.call
или .apply
- это методы функций. Но вот какие функции делают .звоните
обратитесь к? Первым параметром должен быть контекст, но аргументы
- это контекст? Вторым параметром должны быть параметры, передаваемые в функции. Вот они номер 2
. Что это значит? Иногда в библиотеке используется 1
или 0
. Это количество параметров, передаваемых в функции?
_.bind = function bind(func, context) {
var bound, args;
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError;
args = slice.call(arguments, 2);
return bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
ctor.prototype = func.prototype;
var self = new ctor;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (Object(result) === result) return result;
return self;
};
};
Вопрос 2: Не совсем понимаю логику этой функции. Нужна помощь, чтобы понять. Пример должен быть очень полезным.
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
return _.map(obj, function(value) {
return (method.call ? method || value : value[method]).apply(value, args);
});
};
Спасибо за помощь.