Nella fantastica libreria Underscore.js di Jeremy Ashkenas, ho cercato di capire una cosa sul file sorgente. Non capisco questo:Cercando di capire sorgente underscore.js - chiama e applica usato nella libreria
var slice = Array.prototype.slice;
args = slice.call(arguments, 2);
In modo che:
args = Array.prototype.slice.call(arguments, 2);
.call
o .apply
sono i metodi delle funzioni. Ma qui, a quali funzioni si riferisce .call
? Il primo parametro dovrebbe essere il contesto, ma arguments
è contesto? Il secondo parametro dovrebbe essere il parametro da passare nelle funzioni. Qui sono il numero 2
. Cosa significa questo? A volte nella libreria, utilizza 1
o 0
. Sono il numero dei parametri da passare nelle funzioni?
_.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;
};
};
Domanda 2: Io non capisco la logica di questa funzione. Hai bisogno di aiuto per capire. Un esempio dovrebbe essere molto utile.
// 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);
});
};
Grazie per l'aiuto.
'myArray.slice (1) === slice.call (myArray, 1)' – Raynos
Sì che è un grande, modo semplice per mostrare la relazione. – Pointy
@Raynos, in realtà è falso. 'slice' crea due diversi oggetti array, che non sono identici. – katspaugh