Thông số kỹ thuật nháp ECMAScript 6 đã mang lại nhiều niềm vui cho nhà phát triển JavaScript hiện đại. Chúng tôi đã đề cập đến một số lớp tập hợp mới và vòng lặp for..of
trong bài đăng trước. Trong bài đăng này, chúng ta sẽ nói về một chủ đề đi đôi với vòng lặp for..of
: hàm trình tạo.
Có một máy chủ tài liệu hay giải thích lý do và cách sử dụng trình tạo. Tóm lại, trình tạo là các hàm đặc biệt có chức năng tạo hàm lặp, còn đối tượng lặp là các đối tượng có phương thức next()
, có thể được gọi để lấy giá trị. Trong hàm trình tạo, từ khoá yield
cung cấp giá trị cho next()
. Sử dụng yield
tạm ngưng thực thi hàm trình tạo, duy trì trạng thái cho đến khi next()
được gọi lại, tại thời điểm đó mã bắt đầu sao lưu và tiếp tục cho đến khi yield
có một giá trị khác (hoặc cho đến khi hàm trình tạo chấm dứt). Có một số trường hợp sử dụng chuẩn cho các hàm trình tạo, chẳng hạn như sử dụng các hàm này để lặp lại các số trong chuỗi Fibonacci.
Với những khái niệm cơ bản đã sẵn sàng, hãy đi sâu vào với mẫu JavaScript bao gồm một số lỗi, hay “cái lặt vặt” khi làm việc với trình tạo. Có rất nhiều nhận xét xuyên suốt và bạn có thể thử nghiệm phiên bản đang hoạt động của mã trước khi đọc qua:
Vậy, một số bài học lớn từ mã này là gì?
Trước tiên, khi xây dựng một trình tạo sẽ tạo ra một biến lặp duy nhất có trạng thái riêng biệt và bạn có thể truyền các tham số vào hàm khởi tạo của trình tạo để có thể kiểm soát hành vi.
Thứ hai, bạn có thể truyền một tham số khi gọi phương thức next()
của biến lặp. Giá trị đó sẽ được gán cho bất kỳ phần nào ở phía bên trái của câu lệnh yield
trong lệnh gọi trình lặp trước đó. Đây là một cách hay để thay đổi kết quả của biến lặp – ở đây, chúng ta sử dụng nó để kiểm soát xem từ tạo ra có được viết hoa hay không. Nếu bạn muốn tác động đến giá trị đầu tiên được tạo ra, hãy thực hiện việc này thông qua một tham số đến hàm khởi tạo của trình tạo.
Cuối cùng, trình tạo có thể tạo ra các biến lặp hữu hạn hoặc vô hạn. Nếu bạn đang làm việc với một biến lặp vô hạn, hãy đảm bảo rằng bạn có một số loại điều kiện kết thúc dựa trên giá trị yield
ed — rất dễ để vô tình viết các vòng lặp vô hạn, đặc biệt là khi sử dụng for..of
để lặp lại. Nếu bạn đang dùng một biến lặp hữu hạn thông qua các lệnh gọi đến next()
, thì thuộc tính .done
của đối tượng được trả về sẽ cho biết liệu vòng lặp đã hoàn tất hay chưa.
Chúng tôi hy vọng mẫu này cùng với các tài nguyên khác hiện có trên web sẽ mang lại cho bạn sự hứng thú và suy nghĩ về cách sử dụng trình tạo trong đoạn mã của riêng bạn. Các phiên bản Firefox bắt đầu từ phiên bản 31 và Chrome bắt đầu với 39 trình tạo hỗ trợ vốn có. Dự án Regenerator cung cấp tính năng hỗ trợ trình tạo cho các trình duyệt khác và lựa chọn sử dụng Traceur cũng là một lựa chọn.
Cảm ơn Erik Arvidsson đã giúp đánh giá bài viết này.