2014-11-11 28 views
9
function x(){ 
    window.setTimeout(function(){ 
    foo(); 
    if(notDone()){ 
     x(); 
    }; 
    },1000); 
} 

Mối quan tâm của tôi là tăng trưởng ngăn xếp không bị chặn. Tôi nghĩ rằng đây không phải là đệ quy vì cuộc gọi x() trong bộ đếm thời gian dẫn đến một bộ khung ngăn xếp hoàn toàn mới dựa trên một công văn mới trong công cụ JS.Đây có phải là đệ quy hay không

Nhưng đọc các mã như một anh chàng JS không lỗi thời nó khiến tôi cảm thấy khó chịu

Một thêm câu hỏi phụ, những gì xảy ra nếu tôi lên kế hoạch một cái gì đó (dựa trên toán học chứ không phải là nghĩa đen) dẫn đến không chậm trễ . Điều đó có thực thi tại chỗ hay nó sẽ được thực hiện ngay lập tức không đồng bộ hoặc việc triển khai đó được xác định

+2

Không .. nó đặt hẹn giờ và tồn tại chức năng. Tương tự khi bộ hẹn giờ tắt - nó đặt bộ hẹn giờ mới và tồn tại lại chức năng. – Cheery

+2

có thể trùng lặp của [tại sao funcion được gọi bởi setTimeout không có giới hạn callstack?] (Http://stackoverflow.com/q/24631041/1048572) hoặc [Recynion Javascript không đồng bộ] (http://stackoverflow.com/q/17090292/1048572)? – Bergi

Trả lời

2

Đó là recusive trong một cảm giác rằng nó là một chức năng tự gọi mình nhưng tôi tin rằng bạn là đúng về ngăn xếp dấu vết đang biến mất. Trong thực thi bình thường, ngăn xếp sẽ chỉ hiển thị rằng nó được gọi bởi setTimeout. Trình gỡ lỗi chrome ví dụ sẽ cho phép bạn giữ stack traces khi thực thi không đồng bộ, tôi không chắc chắn cách chúng đang thực hiện nhưng công cụ có thể theo dõi ngăn xếp bằng cách nào đó.

Cho dù tính toán bằng cách nào thì việc thực thi sẽ vẫn không đồng bộ.

setTimeout(function(){console.log('timeout');}, 0);console.log('executing'); 

chí đầu ra:

executing 
undefined 
timeout 
+3

không, rõ ràng là _not_ một hàm tự gọi.Đó là một hàm vượt qua (nhưng ** không gọi **) một kết thúc mà tại một số điểm tương lai sẽ được gọi từ vòng lặp sự kiện JS. – Alnitak

+0

Nó tự gọi một cách không đồng bộ nhưng nó vẫn tự gọi. Tôi đồng ý với mọi thứ khác bạn đang nói nhưng tôi nghĩ chúng tôi đang tranh luận ngữ nghĩa ở đây. – pllee

3

Nó không phải - tôi gọi nó là "đệ quy giả".

Lý do là nó trông giống như đệ quy, ngoại trừ việc hàm luôn luôn chấm dứt chính xác ngay lập tức, do đó giải phóng ngăn xếp. Sau đó là vòng lặp sự kiện JS kích hoạt lời gọi tiếp theo.

1

Một câu hỏi phụ, điều gì sẽ xảy ra nếu tôi lên lịch biểu gì đó (dựa trên toán học chứ không phải là chữ) dẫn đến không chậm trễ. Điều đó có thực thi tại chỗ hoặc nó sẽ được thực hiện ngay lập tức không đồng bộ hoặc thực hiện được xác định

Vẫn không đồng bộ. Nó chỉ là bộ đếm thời gian sẽ được xử lý ngay lập tức khi hàm trả về và công cụ JavaScript có thể xử lý các sự kiện trên vòng lặp sự kiện.

0

Recursion có nhiều định nghĩa khác nhau, nhưng nếu chúng ta định nghĩa nó như là cố ý (như trái ngược với lỗi gây ra) sử dụng một chức năng mà các cuộc gọi riêng của mình nhiều lần để giải quyết một vấn đề lập trình (có vẻ là một vấn đề phổ biến trong ngữ cảnh Javascript), nó hoàn toàn là.

Câu hỏi thực sự là liệu điều này có thể làm hỏng trình duyệt hay không. Câu trả lời là không có trong kinh nghiệm của tôi ... ít nhất là không phải trên Firefox hoặc Chrome. Cho dù thực hành tốt hay không, những gì bạn đã có có một mẫu Javascript khá phổ biến, được sử dụng trong rất nhiều ứng dụng web bán thời gian thực. Đáng chú ý, Twitter đã từng làm điều gì đó rất giống với việc cung cấp cho người dùng các cập nhật nguồn cấp dữ liệu bán thời gian thực (tôi nghi ngờ họ vẫn làm điều đó ngay bây giờ khi họ đang sử dụng một máy chủ Node).

Ngoài ra, ngoài tò mò, tôi đã chạy tập lệnh của bạn với lịch đặt lại để chạy 50ms một lần và không bị chậm lại.

Các vấn đề liên quan