2012-04-08 63 views
5

Tôi đang sử dụng mã này để bọc bộ phận của mã trong nó được sử dụng như thế này,như thế nào "chậm trễ" chức năng này hoạt động

var delay = (function() { 
    // SET TIMER 
    var timer = 0; 
    // RETURN SET TIMEOUT FUNCTION 
    return function(callback, ms) { 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    }; 
})();​ 

Tôi gọi nó là như thế này,

delay(function() { 
    ....... 
}, 1000); 

Và nó sẽ trì hoãn nó bằng 1000 mili giây, nhưng tôi không hiểu điều gì đang xảy ra nhờ :)

+0

Tôi đề nghị bạn hỏi rằng trên http://codereview.stackexchange.com/ – Gerep

+0

Hãy xem ['clearTimeout'] (https://developer.mozilla.org/en/DOM/window.clearTimeout) và [ 'setTimeout'] (https://developer.mozilla.org/en/DOM/window.setTimeout). –

+1

Bạn cũng có thể muốn xem định nghĩa chức năng ẩn danh. Đây là [link] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work). – DiamRem

Trả lời

6

Sự chậm trễ là một hàm sẽ trả về một chức năng khác. Các biến đếm thời gian nằm bên trong phần đóng của hàm trễ nên nó vẫn có thể bị hàm trả về. Chức năng. Bạn cũng có thể viết nó như thế này

var delay; 
var timer = 0; 
delay = function(callback, ms) { 
    clearTimeOut(timer); 
    timer = setTimeout(callback, ms); 
} 

Vấn đề mà bạn có bây giờ là nếu bạn gọi trì hoãn hai lần nó sẽ ghi đè lên các biến đếm thời gian để trì hoãn thứ hai sẽ ghi đè lên các biến timer. Tôi đã thử nghiệm này ra và có vẻ như chức năng của bạn cũng bị phá vỡ nó nên là:

var delay = function(){ 
// SET TIMER 
    var timer = 0; 
// RETURN SET TIMEOUT FUNCTION 
    return function(callback, ms){ 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    }; 
}; 

delay()(function(){console.log("hello1");}, 5000); 
delay()(function(){console.log("hello2");}, 5000); 

Nếu mã của bạn cũng làm như vậy nó sẽ chỉ theo dõi hello2 vì là người đầu tiên sẽ ghi đè lên các biến timer.

Trừ khi ý định của bạn là thời gian trễ thứ hai sẽ dừng sự chậm trễ đầu tiên bạn nên sử dụng một bản nâng cấp khác.

+0

Cảm ơn bạn. Điều này đã giúp tôi rất nhiều! – cgwebprojects

2

Điều đầu tiên là thực hiện chức năng này (nhờ vào () ở cuối mã bạn đã đăng):

function() { 
    // SET TIMER 
    var timer = 0; 
    // RETURN SET TIMEOUT FUNCTION 
    return function(callback, ms) { 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    }; 
}​ 

và lưu kết quả vào delay. Khi được thực hiện, hàm này tạo ra một sự đóng với biến cục bộ timer làm cho máy chủ bị ngắt như một bộ đếm cục bộ. Các chức năng sau đó trả về chức năng bên trong:

function(callback, ms) { 
    clearTimeout(timer); 
    timer = setTimeout(callback, ms); 
} 

Vì nó là trong việc đóng cửa, chức năng bên này có quyền truy cập vào biến timer. Không có mã bên ngoài nào khác có thể truy cập timer. Phương pháp này được sử dụng để cho phép nhiều bộ hẹn giờ chạy cùng một lúc mà không phải lo lắng về nhiều biến số timer.

Hãy tưởng tượng nó như thế này: delay hiện chứa một hàm (function(callback, ms) {...) có quyền truy cập vào biến cục bộ, timer. Biến số timer không hiển thị như bất kỳ mã bên ngoài nào có liên quan. Chỉ chức năng mà delay chứa mới có thể truy cập.

Sau đó, bạn gọi hàm bên trong đó bằng cách gọi delay(callback, timeout).

0

trong phần đầu tiên của mã u làm cho một biến đó là sự chậm trễ và gán nếu để giá trị trả về của một hàm .. đó là lần lượt trở về một chức năng mà là

return function(callback, ms) { 
     clearTimeout(timer); 
     timer = setTimeout(callback, ms); 
    } 

vì vậy đây là actly ur độ trễ có thể thay đổi. nw nên khi u gọi nó như thế ..

delay(function() { 
    ....... 
}, 1000); 

này wud việc như mong đợi ..
cũng nhận thấy sự () vào cuối nơi u assing biến delay .. rằng trong javascript có nghĩa là để chạy một chức năng như ngay sau khi nó gặp phải .. vì vậy khi phần đầu tiên của mã tôi thấy nó được chạy và delay biến được gán một hàm .. mà u gọi trong đoạn mã thứ hai

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