2010-06-03 31 views
9

Tôi đã thực hiện mã này:Gọi một chức năng ẩn danh định nghĩa trong một setInterval

window.setInterval(function(){ var a = doStuff(); var b = a + 5; }, 60000) 

Nội dung thực tế của chức năng ẩn danh là tất nhiên chỉ là ví dụ nhỏ này vì nó không quan trọng. Điều thực sự xảy ra là một loạt các biến được tạo ra trong phạm vi của chính hàm đó, bởi vì tôi không cần/muốn gây ô nhiễm không gian toàn cục.

Nhưng như bạn đã biết, hàm doStuff() sẽ không được gọi cho đến 60 giây trong trang. Tôi cũng muốn gọi hàm ngay bây giờ, ngay sau khi trang được tải, và sau đó cứ 60 giây một lần nữa.

Có thể nào đó gọi hàm này mà không cần sao chép/dán mã bên trong vào ngay sau dòng setInterval()? Như tôi đã nói, tôi không muốn gây ô nhiễm không gian toàn cầu với các biến vô dụng mà không cần thiết ngoài chức năng.

+0

Tạo chức năng bên ngoài khoảng thời gian và đặt nó vào một biến? –

+1

Tôi biết, nhưng đó là những gì tôi đang cố gắng tránh, nếu có thể. – Tominator

Trả lời

14

Bạn có thể đặt hàm callback của bạn trong một biến, và quấn lên tất cả mọi thứ trong một chức năng ẩn danh tự gọi:

(function() { 
    var callback = function() { 
     var a = doStuff(); 
     var b = a + 5; 
    }; 

    callback(); 

    window.setInterval(callback, 60000); 
})(); 

Không ô nhiễm.

+3

+1 trong khi mã bên dưới là hoàn toàn hợp lệ, tôi cho rằng nó khó chịu khi đọc. – Warty

+0

Tuyệt, tính năng này hoạt động tốt! – Tominator

5

Điều này có thể mà không cần tạo các biến toàn cầu cũng như:

setInterval((function fn() { 
console.log('foo'); // Your code goes here 
return fn; 
})(), 5000); 

Trên thực tế, theo cách này, bạn không tạo ra bất kỳ biến ở tất cả.

Tuy nhiên, trong Internet Explorer, chức năng fn sẽ trở nên có thể truy cập được từ phạm vi xung quanh (do lỗi). Nếu bạn không muốn điều đó xảy ra, bạn chỉ cần quấn tất cả mọi thứ trong một chức năng ẩn danh tự gọi:

(function() { 
setInterval((function fn() { 
    console.log('foo'); // Your code goes here 
    return fn; 
})(), 5000); 
})(); 

tín dụng đối với Paul Irish cho sharing this trick.


Edit: trả lời được cập nhật với một số thông tin hơn, nhờ bobince.

+0

Thông minh! Gần như quá thông minh :) – Miles

+0

hmm trong trường hợp này hàm ẩn danh được gọi một lần, nhưng sau đó hàm setInterval cho biết "đối số không hợp lệ được chuyển". Nó có thể nhận được kết quả của hàm được thực thi và cố gắng thực hiện lại hàm đó (nó bị vô hiệu) sau 5 giây. – Tominator

+0

@Tominator: Điều đó sẽ không xảy ra. Đoạn mã tôi đã đăng hoạt động tốt trong bảng điều khiển của mình. Vui lòng cho chúng tôi thấy mã của bạn. –

0

chưa một giải pháp:

(function() { 
    var a = doStuff(); 
    var b = a + 5; 
    window.setTimeout(arguments.callee, 60000); 
})(); 

này sử dụng thời gian chờ thay vì khoảng thời gian để nó có thể chạy lần đầu tiên và sau đó chạy nó tự trở lại sau một thời gian chờ.

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