轉(zhuǎn)自:恒星設(shè)計(jì)? URL = http://www.bjcan.com/hengxing/more.asp?lb=94
在使用JScript的時(shí)候,我們有時(shí)需要間隔的執(zhí)行一個(gè)方法,比如用來產(chǎn)生網(wǎng)頁UI動(dòng)畫特效啥的。這是我們常常會(huì)使用方法setInterval或setTimeout,但是由于這兩個(gè)方法是由腳本宿主模擬出來的Timer線程,在通過其調(diào)用我們的方法是不能為其傳遞參數(shù)。
??? 我們常用的使用場景是:
window.setTimeout("delayRun()", n);
window.setInterval("intervalRun()", n);
window.setTimeout(delayRun, n);
window.setInterval(intervalRun, n);
??? 顯然強(qiáng)行代參數(shù)的調(diào)用: window.setTimeout("delayRun(param)", n);
window.setInterval("intervalRun(param)", n);
window.setTimeout(delayRun(param), n);
window.setInterval(intervalRun(param), n);
??? 都是錯(cuò)誤的,因?yàn)閟tring literals形式的方法調(diào)用,param必須是全局變量(即window對(duì)象上的變量)才行;而function pointer形式的調(diào)用,完全錯(cuò)誤了,這是把函數(shù)的返回值當(dāng)成了setTimeout/setInterval函數(shù)的參數(shù)了,完全不是我們所望的事情。
??? 解決這個(gè)問題的辦法可以使用匿名函數(shù)包裝的方式,在以下scenario中我們這么做:
function foo()
{
??? var param = 100;
??? window.setInterval(function()
??? {
??????? intervalRun(param);
??? }, 888);
}
function interalRun(times)
{
??? // todo: depend on times parameter
}
??? 這樣一來,就可以不再依賴于全局變量向delayRun/intervalRun函數(shù)中傳遞參數(shù),畢竟當(dāng)頁面中的全局變量多了以后,會(huì)給腳本的開發(fā)、調(diào)試和管理等帶來極大的puzzle。