2012-04-16 10 views
46

Tôi có truy cập này tôi đã thực hiện nhưng tôi muốn nó chạy mãi mãi, nó thực sự đơn giản, tôi đang làm gì sai ở đây?setInterval callback chỉ chạy một lần

function timer() { 
    console.log("timer!") 
} 

window.setInterval(timer(), 1000) 
+6

Vấn đề là 'timer()' gọi đối tượng hàm kết quả từ việc đánh giá 'timer' và sau đó chuyển kết quả (' undefined') tới 'setTimeout'. Vì vậy, đừng gọi nó. Thay vào đó, chỉ cần vượt qua chức năng đối tượng: 'setInterval (timer, 1000)' –

Trả lời

76

Bạn đã sử dụng cuộc gọi hàm thay vì tham chiếu hàm làm tham số đầu tiên của setInterval. Làm điều đó như thế này:

function timer() { 
    console.log("timer!"); 
} 

window.setInterval(timer, 1000); 

Hoặc ngắn hơn (nhưng khi chức năng được lớn hơn cũng ít có thể đọc được):

window.setInterval(function() { 
    console.log("timer!"); 
}, 1000) 
+1

câu trả lời chỉ đúng ra rằng hàm callback không nên có "()" trong cuộc tranh cãi. – Kristian

+2

Theo https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout, phiên bản ngắn hơn có thể gây rò rỉ bộ nhớ. –

+0

theo liên kết của Crend King, mozilla sucks. – nothrow

8

setIntervalsetTimeoutphải được sử dụng với callbacks, như:

setInterval(timer, 1000); 

hoặc các chức năng chưa đặt tên:

setInterval(function() { console.log("timer!"); }, 1000); 

Tại sao mã của bạn không hoạt động - khi bạn chuyển một hàm làm đối số cho hàm khác bằng dấu ngoặc vuông, ví dụ: doSomething (someFunc()) bạn đang chuyển kết quả của hàm.

Khi chức năng được truyền dưới dạng đối tượng, ví dụ: doSomething (someFunc) bạn đang chuyển một cuộc gọi lại. Bằng cách này, someFunc được truyền làm tham chiếu và nó được thực hiện ở đâu đó trong chức năng gọi. Điều này cũng giống như các con trỏ để hoạt động trong các ngôn ngữ khác.

Lỗi thường gặp là sử dụng hai chức năng này như được hiển thị tại w3schools. Điều này làm cho một cuộc gọi ngầm đến eval.