在使用JavaScript的時候,我們有時需要間隔的執行一個方法,比如用來產生網頁UI動畫特效啥的。這是我們常常會使用方法setInterval或setTimeout,但是由於這兩個方法是由指令碼宿主模擬出來的Timer執行緒,在通過其呼叫我們的方法是不能為其傳遞引數。

我們常用的使用場景是:

window.setTimeout("delayRun()", n);
window.setInterval("intervalRun()", n);
window.setTimeout(delayRun, n);
window.setInterval(intervalRun, n);
    顯然強行代引數的呼叫: window.setTimeout("delayRun(param)", n);
window.setInterval("intervalRun(param)", n);
window.setTimeout(delayRun(param), n);
window.setInterval(intervalRun(param), n);
    都是錯誤的,因為string literals形式的方法呼叫,param必須是全域性變數(即window物件上的變數)才行;而function pointer形式的呼叫,完全錯誤了,這是把函式的返回值當成了setTimeout/setInterval函式的引數了,完全不是我們所望的事情。

解決這個問題的辦法可以使用匿名函式包裝的方式,在以下scenario中我們這麼做:
function foo()
{
    var param = 100;
    window.setInterval(function()
    {
        intervalRun(param);
    }, 888);
}

function interalRun(times)
{
    // todo: depend on times parameter
}
    這樣一來,就可以不再依賴於全域性變數向delayRun/intervalRun函式中傳遞引數,畢竟當頁面中的全域性變數多了以後,會給指令碼的開發、除錯和管理等帶來極大的puzzle。