Tôi luôn nghĩ rằng, vì JavaScript là một chuỗi, tôi có thể đính kèm các trình xử lý sự kiện mà không lo lắng về các trình xử lý được thực hiện trong khi tôi đang thực thi mã. Trước sự ngạc nhiên của tôi, tôi thấy rằng họ có thể. Theo this answer, hộp thoại 'Không phản hồi tập lệnh' có thể khiến các sự kiện được nâng lên trong khi tập lệnh vẫn đang chạy.luồng JavaScript có thể thực thi bị gián đoạn không?
Tôi thử nghiệm này với đoạn mã sau:
<script>
function loop() {
var cond;
onblur = function (event) {
cond = false;
};
cond = true;
while (cond)
;
alert('loop exited!');
}
</script>
<button onclick="loop()">loop()</button>
Trong Firefox 11.0, chức năng in "loop thoát" sau khi nhấp vào tiếp tục. Vòng lặp dường như bị tạm dừng, với các sự kiện được phép thực hiện. Điều này giống như một số Unix signal, tạm thời thay đổi ngữ cảnh của chuỗi đích. Nhưng nó nguy hiểm hơn nhiều, vì nó cho phép thay đổi trạng thái bên ngoài.
Đây có phải là lỗi không? Tôi có nên không còn phụ thuộc vào mô hình JavaScript đơn luồng thực thi và đảm bảo rằng tất cả các tập lệnh của tôi đều được tái nhập không? Hay nó là một lỗ hổng không đáng để theo đuổi mặc dù một trình duyệt chính cho phép điều này xảy ra?
Tôi đoán câu hỏi thực sự sẽ là: "tiêu chuẩn gọi là gì." –
Tôi nghĩ tốt hơn là nên nghĩ đến việc "tạm dừng" xảy ra với một số hành vi tích hợp ('alert()' etc) khi lấy dạng thông dịch bắt buộc "hiệu suất" từ hàm đang chạy vào thời điểm đó, và sau đó , khi "tạm dừng" kết thúc, tiếp tục thực hiện.Nói cách khác, suy nghĩ về chức năng như đã thực sự trở lại trong khi "tạm dừng" đang được tiến hành, và sau đó được tiếp tục như là một sự tiếp tục được tiếp tục. Bằng cách đó, xử lý sự kiện có ý nghĩa hơn rất nhiều, vì nó giống như xử lý sự kiện thông thường. – Pointy
Nhận lời nhắc "không phản hồi" không phải là điều bình thường bạn nên thiết kế. Ứng dụng của bạn bị hỏng là người dùng đã từng nhận được một trong các hộp thoại đó. Bạn nên thiết kế kịch bản của bạn để lời nhắc "không phản hồi kịch bản" không bao giờ xảy ra và sau đó bạn sẽ không phải lo lắng về việc tái nhập. Có vẻ như tôi là một lỗi nhỏ mà một trình duyệt chính cho phép các sự kiện kích hoạt khi được nhắc, nhưng tôi nghĩ việc sửa chữa mã của bạn quan trọng hơn nhiều để lời nhắc không bao giờ xảy ra và điều này không bao giờ là vấn đề. – jfriend00