先看正常普通的循環javascript
var arr = [.........]; for (var i = 0;i < arr.length; i++) { process(arr[i],i); }
上面語句是將arr數組內容讀取出來交給process函數進行處理,可是若是process函數運行過慢的話arr循環次數又多致使執行時間過長瀏覽器就會處於假死狀態。java
下面利用setTimeout和arguments.callee變相代替循環來達到異步的執行process內容的目的,雖然執行時間上不會少。。數組
function asynArr(arr,process){ var i=0,len = arr.length; setTimeout(function(){ process(arr[i] , i); i++; if( i < len ){ setTimeout(arguments.callee,10); } }); }
setTimeout 隔一段時間執行,僅執行一次。瀏覽器
arguments.callee 返回正在被執行函數對象,即異步
function(){ process(arr[i] , i); i++; if( i < len ){ setTimeout(arguments.callee,10); }
這樣上面的asynArr方法就能達到循環和異步執行process的內容的效果。函數
下面一個方法能夠加上正常的循環每次setTimeout處理多幾個數組的內容,雖然可能沒什麼用。code
function asynArr(arr,process,count){ var i=0,len = arr.length,j=count; if(!count) count = 1; if(j>len) j = len; setTimeout(function(){ for (;i < j; i++) { process(arr[i],i); } j = j+count; if(j>len) j = len; if(i<len){ setTimeout(arguments.callee,1) } }); }