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)
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)
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)
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
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ớ. –
theo liên kết của Crend King, mozilla sucks. – nothrow
setInterval
và setTimeout
phả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
.
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)' –