В удивительной библиотеке Underscore.js Jeremy Ashkenas я попытался понять одну вещь об исходном файле. Я не понимаю этого:Попытка понять источник underscore.js - вызов и применение, используемые в библиотеке
var slice = Array.prototype.slice;
args = slice.call(arguments, 2);
, так что:
args = Array.prototype.slice.call(arguments, 2);
.call
или .apply
являются методы функций. Но вот, какие функции делают .call
? Первым параметром должен быть контекст, но arguments
- это контекст? Второй параметр должен быть параметрами, передаваемыми в функции. Вот их номер 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);
});
};
Благодарим за помощь.
'myArray.slice (1) === slice.call (туАггау, 1)' – Raynos
Да, это отличный, простой способ показать отношения. – Pointy
@ Raynos, это на самом деле неверно. 'slice' создает два разных объекта массива, которые не идентичны. – katspaugh