2012-04-08 48 views
5

我使用這個代碼包的部分代碼中使用它這個樣子,請問這個「延遲」功能的工作原理

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

我這樣稱呼它,

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

它會延遲1000毫秒,但我不明白是怎麼回事,謝謝:)

+0

我建議你問一下http://codereview.stackexchange.com/ – Gerep 2012-04-08 22:36:25

+0

看看['clearTimeout'](https://developer.mozilla.org/en/DOM/window.clearTimeout)和[ 'setTimeout'](https://developer.mozilla.org/en/DOM/window.setTimeout)。 – 2012-04-08 22:37:16

+1

你可能也想看看匿名函數的定義。這裏是[鏈接](http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work)。 – DiamRem 2012-04-08 22:44:03

回答

6

延遲是一個函數,它將返回另一個功能。定時器變量位於延遲函數的閉包內部,所以它仍然可以被返回函數所接受。功能。你也可以寫像這樣

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

,你現在已經是,如果你調用延遲的兩倍,將會改寫定時器變量,以便第二延遲將覆蓋定時器變量的問題。我測試了這一點,似乎你的函數也斷了,應該是:

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); 

如果你的代碼做同樣的也只會追蹤hello2因爲第一個將覆蓋定時器變量。

除非你的意圖是第二次延遲將停止第一次延遲,你應該使用不同的approuch。

+0

謝謝。這幫助了我很多! – cgwebprojects 2012-04-09 14:05:29

2

這段代碼所做的第一件事是執行此功能(感謝您發佈代碼最後的()):

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

並將結果存儲在delay中。在執行時,該函數創建一個閉合程序,並使用本地變量timer作爲本地計數器。該函數然後返回內部函數:

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

既然是在閉合,這個內部函數有權訪問timer變量。沒有其他外部代碼可以訪問timer。這種方法用於允許多個定時器一次運行,而不必擔心多個變量timer

想象一下吧:delay現在包含一個函數(function(callback, ms) {...),它可以訪問局部變量timer。就外部代碼而言,變量timer是不可見的。只有delay包含的功能才能訪問它。

然後通過調用delay(callback, timeout)來調用該內部函數。

在第一塊代碼
0

ü使一個變量,它是延遲並分配如果給函數的返回值..其又返回一個函數,它是

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

所以這是actly烏爾延遲變化。 NW 所以當u這樣稱呼它..

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

這WUD按預期..
也注意到()在其中u assing的delay變量結束..這在javascript意味着運行功能一旦它遇到..所以當我看到它的代碼的第一部分運行,並且delay變量被分配了一個函數..你在第二段代碼中調用