2010-02-18 36 views
11

tôi có mã như thế này:Chức năng cho setTimeout được gọi là gì?

setTimeout(foo, 600); 

Tôi luôn luôn nghĩ rằng foo đã không mất bất kỳ đối số, ví dụ:

function foo() { /* bars */ } 

Tuy nhiên, cách làm như sau:

function foo(a) { alert(a); /* bars */ } 

popped lập một cảnh báo hiển thị -7. Số này đại diện cho cái gì?

+1

Câu hỏi hay! Tôi chưa bao giờ nghĩ đến chuyện này trước đây. – Nicole

Trả lời

8

Đó là sự khác biệt về thời gian (tính bằng mili giây) kể từ khi được lên lịch chạy và khi nó thực sự chạy.

alert(setTimeout(function(a) { alert(a) }, 2000)); 

Nếu bạn bỏ cảnh báo đầu tiên trong thời gian, bạn sẽ thấy những cảnh báo bên cạnh là nơi -10 đến 10. Nếu bạn chờ đợi một vài giây, bạn sẽ nhìn thấy cái gì đó là khoảng thời gian bạn chờ đợi trừ năm 2000.

Điều tương tự cũng có thể nhìn thấy đối với setInterval. Chạy phần sau trong Firebug:

setInterval(function(a) { alert(a); }, 2000); 

Hãy thử đóng cảnh báo nhanh chóng, nó sẽ lặp lại 0 lần nữa. Để nó mở - nó sẽ cho bạn một giá trị lớn.

Lưu ý Đây là trên Firefox Mac, nơi giữ cảnh báo mở sẽ ngừng xử lý Javascript, vì vậy bộ hẹn giờ không thực thi cho đến khi tôi đóng cảnh báo. Hành vi của các thử nghiệm ở trên có thể khác trong các trình duyệt khác

+0

yep .. nó được ghi lại theo một cách rất nhỏ ở đây: https://developer.mozilla.org/en/DOM/window.setTimeout. có vẻ như đó là một thứ chỉ có firefox – Claudiu

+0

Khá là một tính năng thông minh, đáng tiếc là IE cũng không có nó. Sau đó, một lần nữa nó là một sự xấu hổ IE không có nhiều thứ :-) –

+1

@Andy E Nếu bạn nhìn vào https://bugzilla.mozilla.org/show_bug.cgi?id=394769 có vẻ như có khá nhiều tranh cãi sự tồn tại của nó ở tất cả, vì nó làm giảm khả năng sử dụng các hàm với các đối số tùy chọn được gọi bởi setTimeout. – Nicole

3

Từ những gì tôi có thể nói ... đối số trong sự khác biệt giữa thời điểm được lên lịch và khi thực sự chạy theo mili giây. Điều thú vị đủ, dường như trình duyệt nhất định như thậm chí các phần phân đoạn của toàn bộ giây ...

<script> 
var a = setInterval(foo, 125); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

sẽ ra một loạt các số không, cùng đi với giá 250, 500, 1000 ... trong khi

<script> 
var a = setInterval(foo, 127); 

console.log(a); 

function foo(b) { 
console.log(b); 
} 
</script> 

chí đầu ra

-2 
12 
-6 
8 
-10 
4 
2 
0 
-2 
-4 
9 
-8 
5 
3 
1 
Các vấn đề liên quan