Làm thế nào để bạn dừng một vòng lặp vô hạn trong Javascript?


77

Giả sử tôi đã vô tình viết điều này:

 do { } while (true);

... và sau đó chạy nó. Ngoài việc giết trình duyệt của bạn, có cách nào để dừng thực thi javascript (tương đương với Ctrl + Break trong cơ bản hoặc Ctrl + C) không?

Thông thường, sau khoảng 30 giây, trình duyệt của bạn sẽ hỏi bạn có muốn dừng tập lệnh đang chạy dài này hay không, nhưng điều này không phải lúc nào cũng xảy ra (như tôi vừa tìm hiểu)!

FYI: Một vòng lặp đơn giản như sau: for (i=1; i > 0; ++i);sẽ khiến trình duyệt của tôi gặp sự cố (Firefox 3.5b4). Tôi không cảm thấy thích thử nghiệm để xem liệu đó có phải là bất kỳ tiện ích bổ sung nào của tôi hay không. Liên tục khởi động lại trình duyệt không phải là ý tưởng của tôi về một đêm thứ Hai vui vẻ.


Vì tò mò, bạn có thể xác định nguyên nhân khiến trình duyệt của bạn không đưa ra cảnh báo 'tập lệnh chậm' không?
alex

2
không có manh mối! (giới hạn 15 ký tự này thật khó chịu)
nickf

Cái này có thuộc về SuperUser không?
Chetan

3
@Chetan: Nó hoàn toàn liên quan đến lập trình ...
nickf

Ồ, tôi đã hiểu nhầm đây là một câu hỏi về việc sử dụng trình duyệt chứ không phải về phát triển plugin. Lỗi của tôi.
Chetan

Câu trả lời:


23

Ít nhất với Chrome, bạn có thể xóa từng tab chứ không phải toàn bộ ứng dụng.

Randolpho cũng đã thông báo cho tôi rằng IE8 có chức năng tương tự.


3
Bạn có thể nói rõ hơn về cách giết một tab không? Chúng ta có tìm kiếm chrome.exe phù hợp và loại bỏ nó trong trình quản lý tác vụ không?
mellamokb

1
phủ định, không hoạt động! ít nhất là không có trên Phiên bản 36.0.1985.125 cho linux
Octopus

2
Nó hoạt động với tôi, trong Phiên bản 40.0.2214.115 (64-bit), nhưng tôi phải đợi vài giây. Câu trả lời này sẽ hữu ích gấp 10 lần và có thể được đánh giá cao nếu nó bao gồm những chi tiết này.
Michael Scheper

1
Tôi thấy điều này phù hợp với tôi, tuy nhiên, nếu bạn nhấn shift + esc trong cùng một tab có vòng lặp vô hạn, Chrome sẽ cho javascript cơ hội để xử lý thao tác nhấn phím / keydown / keyup trước khi quyết định xem nó có nên làm gì không vì javascript của bạn đang bận và không thể xử lý các sự kiện mà bạn đang thực hiện, vô hiệu hóa tất cả các phím tắt của chrome.
Barak Gall,

Trong Chrome, tôi mở một tab mới và nhấp đúp vào xnút theo tên tab. Nó có vẻ hoạt động, mặc dù tôi không chắc tại sao lần nhấp đầu tiên không được đăng ký.
Chương trình Người sói

58

Tôi đang sử dụng phiên bản Chome 45.0.2454.101

Ở góc trên cùng bên phải, tại menu bánh hamburger, nhấp vào Công cụ khác> Trình quản lý tác vụ, sau đó tắt tab từ đó. Đây là nếu cố gắng đóng tab không thành công. Nếu không, một 'X' đơn giản trên tab sẽ giết nó.


có một vòng lặp vô tận trong lệnh gọi lại Ajax khiến dấu X đơn giản bị lỗi khi bạn mở các devtools.
masterX244

54

Cập nhật năm 2018:

Trong Chrome 67, nếu bạn đang mở DevTools ( F12), bạn có thể kết thúc vòng lặp vô hạn mà không giết toàn bộ tab:

  • Chuyển đến bảng Nguồn và nhấp vào "Tạm dừng thực thi tập lệnh".
  • Giữ nút đó và bây giờ chọn biểu tượng "Dừng".

nhập mô tả hình ảnh ở đây

https://developers.google.com/web/updates/2018/04/devtools#stop


Điều này không hiệu quả với tôi, mặc dù có thể với tất cả nội dung trong các nguồn, tôi chỉ không thể tìm thấy tệp phù hợp.
Tigger: Vào

@TiggerToo - Trước tiên, bạn không cần phải tìm đúng tệp. Chỉ cần nhấp vào nút tạm dừng và trình duyệt sẽ dừng ở bất cứ nơi nào bị kẹt.
Sphinxxx

10

ref: /superuser/92617/stop-osystem-ending-popup-alerts-in-firefox
Firefox đặc biệt có vấn đề ...

Cảnh báo! Cẩn thận! KHÔNG chạy cái này!

javascript:
    while (true) alert("irritated and exhausted - yet?");

Điều này sẽ "vô hạn" và sẽ KHÔNG làm cạn kiệt thời gian chờ nội bộ vì tập lệnh sẽ không nhai thời gian CPU đủ nhanh. Trong FF 11, điều này đảm bảo sẽ không có cơ hội phá thai theo kiểu "kịch bản không phản hồi".

Việc dừng một cách duyên dáng chỉ tập lệnh vi phạm là có thể xảy ra và không đáng kể trong các phiên bản trình duyệt đầu tiên, bằng cách sử dụng can thiệp thủ công, mà không cần gian lận và hủy bỏ toàn bộ trình duyệt. Không có quyền kiểm soát như vậy là một lỗi thiết kế phần mềm trình duyệt lớn. Cần có sự khéo léo và phản xạ không hợp lý để tác động đến cơ chế vận động bằng tay của các "giải pháp" được mô tả trong tài liệu tham khảo.

Lưu ý: Có thể các tập lệnh chạy "vô hạn" với thời gian chờ VÀ không có lời nhắc loại cảnh báo. Chúng đặc biệt nguy hiểm và khó chịu. Về cơ bản, các tập lệnh chạy đủ chậm để phân bổ chu kỳ thời gian CPU là 20 giây. được kéo dài ra trong vài phút hoặc vài giờ hoặc ..., trước khi hết thời gian, bằng cách tạm dừng thực thi chờ tiếp tục lại trên trình kích hoạt sự kiện. Thay vì định thời gian cho chu kỳ CPU, sẽ tốt hơn rất nhiều cho các tập lệnh để hết thời gian chờ theo thời gian thực. (Bạn có bao giờ nhận thấy cách bạn không thể hủy bỏ một tập lệnh đang cố gắng truy xuất nội dung - nhưng không thành công - để xây dựng một trang không? Trong FF, cả các nút trên thanh địa chỉ reloadcancel/stopđều bị vô hiệu hóa mặc dù ít nhất có thể đóng tab.) Javascript bình thường Timeout()setInterval() các cuộc gọi không bị như vậy và được điều chỉnh để trong khi bị tạm dừng, có thể can thiệp thủ công để hủy bỏ chúng một cách "duyên dáng".

Môi trường thử nghiệm cho các quan sát thực nghiệm:

window.navigator.userAgent=
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0

Tái bút. kịch bản

for (i=1; i > 0; ++i);

cuối cùng sẽ mắc lỗi tràn khi ivượt quá giá trị tối đa cho phép.


9

Nếu bạn đang sử dụng Chrome, bạn có thể dễ dàng tắt tab không phản hồi.

Khi bạn thấy một vòng lặp JavaScript vô hạn xảy ra, hãy làm theo các bước sau:

1.Nếu bạn đã mở một tab khác, hãy chuyển sang tab đó hoặc Mở một tab mới

2.Nhấn "Shift + Esc" để mở Trình quản lý tác vụ của Chrome

3. Tìm tab của bạn trong danh sách (Nên ở với người tiêu dùng nhiều bộ nhớ nhất trong danh sách) và nhấp vào nút "Kết thúc quá trình".


Điều hướng đến tab khác rất quan trọng, vì JavaScript sẽ bắt phím của bạn và không làm được gì trên đó vì vòng lặp vô hạn của nó.


4

Hầu hết các trình duyệt đều có cảnh báo "hiệu suất tập lệnh chậm" xuất hiện khi javascript nằm ngoài tầm kiểm soát đang mất nhiều thời gian để thực thi. Hộp thoại cảnh báo này thường cung cấp tùy chọn để loại bỏ tập lệnh vi phạm.


5
-1 thừa. OP: "Thông thường, sau khoảng 30 giây, trình duyệt của bạn sẽ hỏi bạn có muốn dừng tập lệnh đang chạy dài này hay không, nhưng điều này không phải lúc nào cũng xảy ra (như tôi vừa phát hiện ra)!" Tôi cũng gặp phải vấn đề tương tự, với hộp thoại không phải lúc nào cũng hiển thị.
mellamokb

Xem stackoverflow.com/questions/905322/… để biết nguyên nhân có thể là tại sao "hộp thoại không phải lúc nào cũng hiển thị".
user66001

4

Phụ thuộc vào trình duyệt. Một số cho phép bạn nhấp vào nút "dừng" để ngừng thực thi javascript. Những người khác thì không.

Tôi đề nghị cách tốt nhất là chỉ giết trình duyệt hoặc tab hoàn toàn.


0

hầu hết các trình duyệt tốt đều hiển thị cảnh báo "tập lệnh không phản hồi" ... Nếu không, tôi đoán cách hành động tốt nhất của bạn sẽ là tìm hiểu lý do tại sao cảnh báo không xuất hiện.


0

Từ /superuser/92617/stop-osystem-ending-popup-alerts-in-firefox#comment93927_92617 , bởi ẩn danh :

Đây không phải là một giải pháp có mục đích chung thỏa đáng, nhưng với Greasmonkey (hoặc có thể là Ubiquity hoặc Jetpack), bạn có thể ghi đè window.alert bằng một hàm gọi window.confirm và tùy chọn ném (các) lỗi, dừng tất cả quá trình thực thi tập lệnh hoặc bật cờ để dừng cảnh báo. Điều đó có thể hữu ích nếu một trang web bạn tiếp tục quay lại trình bày hành vi này.


0

Những gì tôi làm khi sử dụng Chrome và điều này xảy ra là nhấn shift + ctrl + esc để hiển thị trình quản lý tác vụ windows. Sau đó, chuyển sang tab quy trình và cuộn qua các quy trình chrome.exe (chrome có một quy trình cho mỗi tab đang mở) cho đến khi tôi tìm thấy một quy trình có mức sử dụng cpu cao hơn đáng kể so với oters. Nó có xu hướng khoảng 30% đối với tôi trong khi tất cả những người khác có như 0-2% Sau đó, tôi sẽ chỉ kết thúc quá trình đó. Trên thực tế, điều tương tự có thể được thực hiện bằng cách truy cập tools> taskmanager hoặc shift + esc trong chrome để mở taskmanager tùy chỉnh cho các quy trình của nó. Có thể dễ sử dụng hơn vì nó hiển thị nhiều thông tin hơn về các tab.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.