Trong thư viện Underscore.js tuyệt vời của Jeremy Ashkenas, tôi đã cố gắng hiểu một điều về tệp nguồn. Tôi không hiểu điều này:Cố gắng hiểu nguồn gọi underscore.js và áp dụng được sử dụng trong thư viện
var slice = Array.prototype.slice;
args = slice.call(arguments, 2);
Vì vậy mà:
args = Array.prototype.slice.call(arguments, 2);
.call
hoặc .apply
là các phương pháp của các chức năng. Nhưng ở đây, chức năng nào làm .call
tham khảo? Tham số đầu tiên phải là ngữ cảnh, nhưng arguments
là ngữ cảnh? Tham số thứ hai nên là các tham số để truyền trong các hàm. Đây là số 2
. Điều đó có nghĩa là gì? Đôi khi trong thư viện, nó sử dụng 1
hoặc 0
. Họ có phải là số lượng các tham số để vượt qua trong các chức năng không?
_.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;
};
};
Câu hỏi 2: Tôi không hiểu rõ logic của hàm này. Cần giúp đỡ để hiểu. Một ví dụ nên rất hữu ích.
// 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);
});
};
Cảm ơn bạn đã trợ giúp.
'myArray.slice (1) === slice.call (myArray, 1) ' – Raynos
Có đó là một cách tuyệt vời đơn giản để hiển thị các mối quan hệ. – Pointy
@Raynos, nó thực sự là sai. 'slice' tạo hai đối tượng mảng khác nhau, không giống nhau. – katspaugh