Sử dụng vòng lặp với callback
Ở bài này sẽ không giới thiệu Promise, nhưng có giải thích kỹ hơn về hàm bất đồng bộ, cùng với scope của biến.
Khi sử dụng vòng lặp và callback lấy giá trị từ vòng lặp thì nên sử dụng cẩn thận vì có thể gặp một số lỗi không mong muốn.
Ví dụ muốn in các biến đếm trong vòng lặp for
trong callback của hàm setTimeout
:
|
|
Để ý là hàm callback là closure (hàm lấy giá trị từ bên ngoài hàm). Cùng với đó là hàm callback cũng là hàm bất đồng bộ.
Kết quả sẽ in ra là năm số năm 5, 5, 5, 5, 5
.
Lý do cho kết quả trên là hàm bất đồng bộ trong setTimeout
sẽ chạy sau khi vòng for
được chạy. Hàm callback này sẽ lấy giá trị biến i
ở ngoài hàm, và biến này chỉ được khởi tạo một lần duy nhất.
Ví dụ ở trên có thể viết lại:
|
|
Sửa lỗi hàm callback lấy giá trị biến đếm của vòng for
Nếu muốn ví dụ ở trên in được ra giá trị từ 0
đến 4
thì chúng ta có thể sửa lại bằng cách tạo ra mỗi biến khác nhau trong hàm callback.
Đầu tiên là sử dụng let
, khi sử dụng với từ khóa let
thì một biến mới được tạo ra. Trong vòng lặp for
lúc này sẽ có 5 biến mới được tạo ra.
|
|
Hay có thể viết ngắn gọn thành:
|
|
Truyền biến vào tham số hàm callback
Chúng ta có thể sửa lại ví dụ đầu tiên bằng cách truyền tham số vào hàm callback.
|
|
Tạo ra các closure
Ví dụ này khác ví dụ trước là tạo ra các closure, trong đó từng closure sẽ tạo ra các biến khác nhau.
Closure là hàm có thể sử dụng lại các biến ở bên ngoài hàm, ngay cả khi hàm ở ngoài đã thực thi xong.
|
|
Còn một cách nữa cũng có thể tạo ra hàm không tên ở trong callback.
Ví dụ sau sẽ tạo hàm không tên trong callback và thực thi nó ngay lập tức. Mỗi hàm sẽ nhận các tham số khác nhau.
|
|