2009-06-02 12 views
32

Hai câu hỏi:setInterval/setTimeout giá trị trả về

  1. Làm thế nào là giá trị trả về từ setIntervalsetTimeout (những người sử dụng để xóa các tính giờ) tính?

  2. Có thể cho cả hai hàm trả lại cùng một giá trị trong thời gian chạy không? Ví dụ:

    var a = setInterval(fn1, 1000);
    var b = setTimeout(fn2, 1000);

Có thể cho ab có giá trị giống nhau không?

Câu hỏi đầu tiên là câu hỏi của tôi nhiều hơn, nhưng câu hỏi thứ hai quan trọng hơn.

Trả lời

32

Returns a value which can be used to cancel the timer. Vì vậy, nó sẽ có vẻ không chắc rằng họ trả về giá trị tương tự (trừ khi họ là những giá trị tái sử dụng và một trong những tính giờ đã bị hủy)

Mozilla states it's DOM level 0, but not part of the specification. (nhìn vào dưới cùng của trang)

tôi đã có một tham chiếu thậm chí tốt hơn:

Nabble nói:

setTimeout và setInterval là fro m đặc điểm kỹ thuật Javascript gốc, pre-ECMA. Đặc điểm kỹ thuật đó không phải là được tiêu chuẩn hóa chính thức ở bất kỳ đâu, nhưng nó được hỗ trợ bởi tất cả các trình duyệt web và hầu hết các triển khai của ngôn ngữ Javascript . (Bao gồm ActionScript.)

Thông số kỹ thuật trước ECMA thường được gọi là API "DOM-0" là . Vì chúng có chưa bao giờ được chuẩn hóa trước đây, nên có ý nghĩa đối với HTML5 để cuối cùng xác định các API không được dùng nữa trong một nỗ lực để cung cấp môi trường nhất quán trên các trình duyệt. Đặc biệt khi sự kiện gần đây đã chứng minh rằng có là những công ty muốn thực hiện thư của tiêu chuẩn, nhưng không phải là tinh thần.

Đọc thông số gốc here hoặc từ Sun (người xác nhận sớm JavaScript).

+0

+1 cho trang web ref (tốt hơn nếu nó là MDC mặc dù :) –

+0

hehe nvm, xem nó đã được thêm vào. –

+0

Tôi ước tôi có thể chọn hai câu trả lời được chấp nhận. Cảm ơn bạn đã tham khảo! – aditya

2

Từ trang web của Mozilla:

intervalID là một ID duy nhất khoảng thời gian bạn có thể vượt qua để clearInterval().

Vì vậy, nó là duy nhất :)

+1

Nó có thể là duy nhất đối với các giá trị được trả về từ nhiều cuộc gọi setInterval, nhưng điều đó không đảm bảo tính duy nhất đối với các giá trị được trả về bởi setTimeout. –

+0

"Có thể cho cả hai hàm trả về cùng một giá trị trong thời gian chạy không?" - Vì vậy, ehh Không, họ là duy nhất :) – Ropstah

6

tôi nghĩ rằng nó không phải là một hành vi chuẩn hoá. Trong firefox, nó chỉ là số nguyên, tăng trên mỗi cuộc gọi của setTimeout hoặc setInterval. Và, không, họ không thể có cùng giá trị.

+0

Họ sẽ * không bao giờ * có cùng giá trị? Bất kể tập lệnh được chạy bao lâu? – aditya

+1

Thật đáng để xem câu trả lời của tôi cho nền chính xác về cách nó được hỗ trợ và cho dù đó là "trong spec" hay không. – cgp

+0

@aditya Tôi nghĩ rằng nó sẽ kiểm tra nếu id nó tạo ra đã tồn tại trong bộ nhớ, và tạo ra một cái mới trong trường hợp hiếm hoi mà nó tồn tại. Đó là những gì tôi sẽ làm nếu đối phó với các số ngẫu nhiên. –

1

Liệu chúng có thể có cùng giá trị hay không phụ thuộc vào việc triển khai JavaScript. Như Maciej đã đề cập trong Firefox, chúng không thể có cùng giá trị với cùng một bộ đếm được sử dụng. Tuy nhiên, điều đó có thể khác trong các trình duyệt khác, do đó, có lẽ tốt nhất là không dựa vào chúng không bao giờ có cùng giá trị.

31

Tested này dưới Opera 9, Safari 3, Firefox 3 và IE 7.

Tất cả các giá trị số nguyên trở lại, bắt đầu từ 1 và sau đó incrementing bởi 1 cho mỗi cuộc gọi đến setTimeOut()setInterval(). Tuy nhiên, tôi nhận thấy rằng các trình duyệt đã bắt đầu các quầy và xử lý chúng khác nhau:

  • IE bắt đầu với một số có vẻ ngẫu nhiên gồm 6 chữ số. Sau khi đóng và mở lại IE, tôi thấy rằng số khởi đầu dường như được tạo ngẫu nhiên, vì nó không ở gần số đếm từ phiên trước.
  • Opera duy trì bộ đếm cho mỗi tab - đóng một tab và mở một tab mới bắt đầu bộ đếm từ 1 trong tab mới.
  • Trong Safari, số lượng là toàn cầu - mở một tab mới và gọi các hàm trong các tab khác nhau dường như tăng bộ đếm tham chiếu toàn cầu.
  • Trong Firefox, bộ đếm xuất hiện bắt đầu ở mức 2 và tăng lên trên mỗi lần gọi tiếp theo đến một trong hai chức năng. Giống như Opera, mỗi tab có giá trị truy cập riêng, nhưng tất cả chúng đều bắt đầu ở số 2.

Lưu ý rằng, trong tất cả các trường hợp, không có hai số nhận dạng (ít nhất trong cùng một tab) giống nhau.

+9

Tôi đã hy vọng tìm hiểu xem giá trị trả về có luôn đúng hay không, và có vẻ như đó là trường hợp mặc dù không được chỉ định. Cảm ơn bạn đã kiểm tra tất cả các trình duyệt đó. – w00t

1

Có vẻ như giá trị trả về là giá trị chỉ mục cho bất kỳ danh sách giờ/khoảng thời gian nào được giữ trong nội bộ được duy trì trong nội bộ.

Khi đó, tôi gọi hàm clearInterval (18) thay vì clearInterval (var_returned_from_set) và nó đã dừng bộ hẹn giờ/khoảng thời gian mong muốn. (Đã kiểm tra FF17.0.1 và IE9.0.8)

Cũng trong thử nghiệm của riêng tôi, chúng dường như là duy nhất trong suốt thời gian tồn tại của trang cho cả hai trình duyệt đó.