Không có cách nào trực tiếp để "tiêu diệt" chức năng javascript đang chạy.
có thể khắc phục, mặc dù bạn cần phải thay thế while(1)
loop:
var i = 0; // for testing purposes
var toCall = "runInfinite()";
function runInfinite(){
// do stuff
console.log(i++);
setTimeout(function(){ eval(toCall); }, 100); // or whatever timeout you want
}
setTimeout(function(){ eval(toCall); }, 0); // start the function
setTimeout(function(){ toCall = ""; }, 5000); // "kill" the function
Tôi biết sử dụng eval()
được coi là xấu thực tế, tuy nhiên ý tưởng phải rõ ràng. Hàm này tự gọi (không đệ quy, do đó, setTimeout()
) sử dụng biến số toCall
. Khi biến này không được đặt, bạn sẽ xóa nó từ bên ngoài.
Bạn có thể bao bọc các biến và hàm này trong một lớp để bạn có thể triển khai hàm "kill" của mình.
Tại sao bạn loại trừ bằng cách sử dụng cờ? Có vẻ như là nơi hoàn hảo để sử dụng nó. – nunespascal
AFAIK, khối 'while (1)' theo nghĩa đen sẽ chặn luồng và không cho phép bất kỳ thứ gì khác chạy. Tôi không có nguồn nào khác ngoài kinh nghiệm. (hoặc có thể nó chỉ chậm đến mức có thể đóng băng hiệu quả) Nếu tôi có tài liệu, tôi sẽ đăng câu trả lời. –
JavaScript (trong trình duyệt) là chuỗi đơn nên vòng lặp while _actually_ chặn luồng; và bạn không có chuỗi nào khác mà bạn có thể sử dụng để thăm dò ý kiến / đặt cờ. –