我們常用的使用場景是:
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。