1) Làm thế nào để tham số 1 (index) biết đến là một số nguyên?
jQuery chuyển số nguyên.
2) Làm thế nào để biết chức năng tăng chỉ mục?
Gọi lại không tăng index
, phương thức jQuery thực hiện.
3) Tham số thứ hai (oldValue) biết giữ giá trị cũ của thuộc tính (trước khi sửa đổi) như thế nào?
jQuery chuyển nó.
Câu trả lời cho câu hỏi 1-3 đang có lẽ hiểu tốt nhất bởi một hàm thực hiện một cái gì đó tương tự như $.attr
:
Array.prototype.each = function (f) {
var i;
for (i=0; i < this.length; ++i) {
f(i, this[i]);
}
};
['zero', 'one', 'two'].each(function (i,item) {console.log({i: item})});
f
là một callback. each
có trách nhiệm lặp qua bộ sưu tập và gọi f
cho mỗi chỉ mục & mục. Cấu trúc mã tương tự có thể được sử dụng cho các chức năng:
/* Map each item in a sequence to something else,
* returning a new sequence of the new values.
*/
Array.prototype.map = function (f) {
var i, result = [];
for (i=0; i < this.length; ++i) {
result[i] = f(i, this[i]);
}
return result;
};
['zero', 'one', 'two'].map(function(i,item) {return item.length});
// result: [4, 3, 3]
/* Return a sequence of the items from this sequence
* for which 'keep' returns true.
*/
Array.prototype.filter = function (keep) {
var i, result = [];
for (i=0; i < this.length; ++i) {
if (keep(i, this[i])) {
result.push(this[i]);
}
}
return result;
};
['zero', 'one', 'two'].filter(function(i,item) {return item.length <= 3});
// result: ['one', 'two']
Thực hiện mapconcat
, foldl
and foldr
trái như một bài tập. Một bài tập khác, viết lại map
và filter
theo điều khoản của each
.
Lưu ý rằng các chức năng này chỉ nhằm mục đích minh họa cách hoạt động của cuộc gọi lại. Chúng có thể gây ra vấn đề trong mã sản xuất.
4) Đây có phải là cấu trúc jQuery không? Một điều JSON? Nó tuyệt thật. nó hoạt động, nhưng ... cái quái gì gọi là "giá trị gọi lại" này là gì?
Callbacks là một kỹ thuật chung mà jQuery sử dụng rộng rãi. Chúng là tính năng chính của functional programming, trong đó các hàm là dữ liệu có thể hoạt động giống như các loại dữ liệu khác. Do đó, bạn có các hàm có chức năng như các đối số và có thể trả về các hàm. Trong các ngữ cảnh nhất định, callbacks còn được gọi là "tiếp tục" và tạo thành cơ sở của continuation passing style (CPS). Điều này đặc biệt quan trọng đối với asynchronous function calls [2] (trong đó hàm trả về trước khi tính toán hoàn thành, thay vì synchronous calls), chẳng hạn như được sử dụng cho các yêu cầu Ajax. Để xem một số quyền lực của CPS, hãy đọc "Use continuations to develop complex Web applications".
Mặt khác, "giá trị" trong "gọi lại giá trị", là JS là ngôn ngữ được nhập động (các kiểu được liên kết với dữ liệu, chứ không phải biến), các tham số chính thức có thể được ràng buộc với các đối tượng bất kỳ loại nào. Một hàm có thể hoạt động khác nhau tùy thuộc vào những gì được truyền. Đôi khi điều này được thực hiện bằng cách kiểm tra loại đối số, có hiệu lực ad-hoc polymorphism (chức năng, thay vì ngôn ngữ, phải xử lý công văn). Tuy nhiên, parametric polymorphism hoặc (không làm như vậy) duck typing phải luôn được ưu tiên hơn khi kiểm tra các loại đối số. Đa hình tham số đạt được bằng cách đảm bảo rằng tất cả các loại có thể được truyền cho một hàm nhất định hỗ trợ cùng một giao diện (tên phương thức, đối số, điều kiện tiên quyết, postconditions & vv). Ví dụ: tất cả các loại trình tự phải có thuộc tính length
và được lập chỉ mục theo số nguyên; miễn là giữ, bạn có thể sử dụng loại trình tự của riêng bạn với nhiều chức năng lấy mảng.
Tôi không chắc chắn ý bạn là gì bởi JSON, nhưng có lẽ đó không phải là ý nghĩa chung. JSON là một định dạng trao đổi dữ liệu dựa trên một phiên bản giới hạn của cú pháp ngữ pháp đối tượng JS. JSON không liên quan đến bất kỳ đâu trong mã mẫu hoặc văn bản được trích dẫn.
Sự cố tuyệt vời. Cảm ơn! – sleeper
Phân tích thậm chí tốt hơn! Bây giờ tôi hiểu rồi. Vậy mô hình này KHÔNG phải là một ví dụ về cà ri? – sleeper
Thảo luận về currying này vẫn còn quá mới mẻ với tôi, nó nằm trên đầu tôi.Tuy nhiên, sự cố của bạn HOÀN THÀNH câu trả lời và giải thích các vấn đề được nêu ra trong câu hỏi của tôi. Vì vậy, tôi đã chuyển sự lựa chọn của tôi về câu trả lời cho bạn. Cảm ơn tất cả công việc bạn đưa vào câu trả lời này! – sleeper