Vì hàm này nó sẽ đếm i
liên tục từ 0
tới 1e7
hoặc cho đến khi thời thời gian hiện tại - thời gian bắt đầu đã vượt qua thời gian cần chờ.
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
Việc này dĩ nhiên sẽ chiếm CPU và Javascript sẽ chạy liên tục, không trả về control cho Browser.
Nếu bạn nói tới setTimeout
thì đây lại là một câu chuyện khác. Đạt không làm javascript nên Đạt không dám chắc 100%. Nhưng thông thường các hàm dạng này sẽ không có sleep
mà nó sẽ đăng ký một event với hệ điều hành(OS) gọi là time event.
Ví dụ, Đạt muốn code Javascript trong 5s nữa thực thi X. Thì Đạt sẽ báo với OS rằng, 5s nữa mày gửi cho tao event rằng 5s đã trôi qua. Sau đó Javascript sẽ làm công việc của nó và trả control về cho Browser.
OS sẽ có một đồng hồ riêng, dựa vào CPU tick, để tính ra thời điểm 5s kể từ khi JS đăng ký cái event này. Khi thời điểm 5s đã đến thì OS sẽ gửi một event tới, có thể là tới Brower hiện tại, để nhắc rằng sự kiện này đã xảy ra. Khi đó JS sẽ thực thi X.
Điều này sẽ chuyển việc “Chờ” đến cho OS thực hiện thông báo lại qua event. Đó là lý do tại sao hàm setTimeout là async
chứ không phải là sync