2012-07-03 38 views
7

Tôi đang làm việc theo cách của mình thông qua "Học jQuery" (Ấn bản thứ ba).jQuery: "Gọi lại giá trị" là gì?

Trong Chương 4: "Thao tác DOM" có một phần giải thích một cái gì đó gọi là "Value Callback". Đây là một cái mới cho tôi.

Tác giả giải thích điều này thông qua ví dụ về danh sách các liên kết trong đó ID của mỗi số phải là duy nhất.

Từ cuốn sách:.

"Một callback giá trị chỉ đơn giản là một chức năng được cung cấp thay vì giá trị cho một cuộc tranh cãi Chức năng này sau đó được gọi một lần cho mỗi phần tử trong tập hợp Dù dữ liệu được trả về. từ hàm được sử dụng làm giá trị mới cho thuộc tính. Ví dụ: chúng tôi có thể sử dụng kỹ thuật này để tạo giá trị id khác cho mỗi phần tử, như sau: "

Chaffer, Jonathan (2011-09-23). Học jQuery, Ấn bản thứ ba (tr. 116). Xuất bản Packt. Kindle Edition.

jQuery(document).ready(function($){ 

// get all external links 
    $('div.chapter a').attr({ 
     rel:'external', 
     title:'Learn more at Wikipedia', 
     id: function (index, oldValue) { 
       return 'wikilink-' + index; 
     } 
    }); 
}) 

trình như một say mê, nhưng cơ chế của id: bất động sản thoát khỏi tôi.

  1. Làm thế nào không tham số 1 (index) biết là một số nguyên?
  2. Làm cách nào để chức năng biết đến chỉ số tăng?
  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?
  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 ... những gì heck điều này "giá trị gọi lại" điều làm bằng?

Xin cho biết

Trả lời

6

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 mapfilter 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.

+0

Sự cố tuyệt vời. Cảm ơn! – sleeper

+0

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

+0

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

4

Đó là cấu trúc JQuery. Nếu bạn nhìn vào nguồn, bạn sẽ thấy rằng JQuery đang kiểm tra tham số để tìm hiểu xem bạn đã vượt qua một giá trị hay một hàm. Nếu đó là một hàm, nó xử lý như bạn thấy.

+0

Chà. Rất tuyệt. Bạn có thể đề nghị đọc thêm về chủ đề này không? – sleeper

+0

Trên thực tế, '$ .attr' không sử dụng cà ri. Currying đang chuyển đổi một hàm * n * -ary (một hàm nhận các đối số * n *) thành các hàm * n * unary, mỗi hàm trong số đó (trừ hàm cuối) trả về một hàm unary. – outis

Các vấn đề liên quan