2010-11-06 35 views
9

Tôi dường như đang nhận được lời khuyên mâu thuẫn trong sách tôi đã đọc về chức năng này. Tôi tự hỏi nếu có ai đó có thể làm rõ. Ví dụ: Nicholas Zakas tuyên bố đối số chức năng có chữ ký của định dạng chức năng (khớp, pos, originalText) (P139: JavaScript chuyên nghiệp cho nhà phát triển web 2nd ed: Wrox)Chuỗi JavaScript Thay thế bằng biểu thức chính quy và chức năng làm đối số

Anh ta tiếp tục nói Khi biểu thức chính quy có một kết hợp, hàm được chuyển qua ba đối số (như trên). Khi có nhiều nhóm chụp, mỗi chuỗi phù hợp được chuyển thành một đối số, với hai vị trí cuối cùng là vị trí và văn bản gốc ...

Sau đó, chúng tôi đến Doug Crockfords, JavaScript: Các phần tốt. (P90): Ông quy định cú pháp một lần nữa như chuỗi (searcValue, replaceValue) searchValue có thể là một regex - tuyệt vời phù hợp .. nếu replaceValue là một hàm, tham số đầu tiên là văn bản phù hợp, sau đó thứ hai là nhóm chụp 1 , thứ ba là chụp nhóm 2 và cứ thế .. Có một sự khác biệt đáng chú ý ở đây. (ví dụ: Không có đối số vị trí)

Tôi cũng đang xem ví dụ trong các mẫu Thiết kế JavaScript Pro (APress P152) đã bắt đầu quá trình tham chiếu chéo toàn bộ này. Những kẻ này (Ross Harmes/Dustin Diaz), thay vì vô tình chỉ định hàm replaceValue với hai đối số có tên là & b. Nhưng nó có xu hướng củng cố khái niệm Doug Crockford mô tả.

Ai đó có thể xác nhận liệu mô tả của Nicholas Zakas có thực sự là một lựa chọn hợp lệ không?

Trả lời

8

Zakas là chính xác, đối số áp chót và cuối cùng là posoriginalText. Từ ECMA-262 3rd5th phiên bản (phần 15.5.4.11):

Nếu replaceValue là một chức năng, sau đó cho mỗi chuỗi con phù hợp, gọi hàm như sau m + 3 đối số. Đối số 1 là chuỗi con phù hợp. Nếu searchValue là cụm từ thông dụng, thì đối số m tiếp theo là tất cả các ảnh chụp trong MatchResult (xem 15.10.2.1). Đối số m + 2 là khoảng trống trong chuỗi nơi xảy ra sự trùng khớp và đối số m + 3 là string.

Lưu ý rằng String.prototype.replace là mới trong ECMA-262 Phiên bản thứ ba. Tài liệu MSDN cho tài liệu JScript và MDC cho JavaScript đều phù hợp với đặc điểm kỹ thuật này.

+0

Cảm ơn bạn đã liên kết và. Moziila đặc biệt là tuyệt vời. – JGFMK

4

Các spec ECMAScript có:

String.prototype.replace (searchValue, replaceValue) 

Nếu searchValue là một biểu thức chính quy (một đối tượng mà [[Lớp]] tài sản là "RegExp "), hãy làm như sau: Nếu searchValue. toàn cầu là sai, sau đó tìm kiếm chuỗi cho trận đấu đầu tiên của cụm từ thông dụng searchValue. Nếu searchValue.toàn cầu là đúng, sau đó tìm kiếm chuỗi cho tất cả các kết quả phù hợp của cụm từ thông dụng searchValue. Thực hiện tìm kiếm theo cách tương tự như trong String.prototype.match, bao gồm cả bản cập nhật của searchValue. lastIndex. Để m là số lượng dấu ngoặc đơn còn lại trong searchValue (NCapturingParens như được chỉ ra trong 15.10.2.1).

Nếu searchValue không phải là cụm từ thông dụng, hãy để searchString là ToString (searchValue) và chuỗi tìm kiếm cho lần xuất hiện đầu tiên của searchString. Gọi m là 0.

Nếu replaceValue là hàm, sau đó cho mỗi chuỗi con phù hợp, hãy gọi hàm với các đối số m + 3 sau. Đối số 1 là chuỗi con phù hợp. Nếu searchValue là một biểu thức chính quy, các đối số m tiếp theo là tất cả các ảnh chụp trong MatchResult (xem 15.10.2.1). Đối số m + 2 là độ lệch trong chuỗi nơi khớp xảy ra và đối số m + 3 là chuỗi. Kết quả là một chuỗi giá trị bắt nguồn từ đầu vào ban đầu bằng cách thay thế mỗi chuỗi con phù hợp với giá trị trả về tương ứng của cuộc gọi hàm, được chuyển đổi thành chuỗi nếu cần.

Hơi khó hiểu nhưng tôi nghĩ Zakas là đúng.

+0

Cảm ơn bạn đã trả lời. Bạn có một liên kết đến spec? – JGFMK

+0

http://bclary.com/2004/11/07/ cho rev 3 html. trang web chính thức là http://www.ecmascript.org/docs.php –

+0

Chúc mừng cho liên kết – JGFMK

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