还有什么可以用来代替arguments.callee?

时间:2010-10-06 16:48:33

标签: javascript

function runProcess(){
     var todo = items.concat();
     setTimeout(function(){
        process(todo.shift());
        if(todo.length > 0){
           setTimeout(arguments.callee, 25);
        } else {
           callback(items);
        }
     }, 25);
}

我尝试将此块重构为函数

function doWork(todo){
        process(todo.shift());
        if(todo.length > 0){
           setTimeout(arguments.callee, 25);
        } else {
           callback(items);
        }
     }

但这次给定阵列从头开始重复

我认为问题出现在 arguments.callee 中,那么我可以使用什么而不是它呢?
最诚挚的问候

2 个答案:

答案 0 :(得分:2)

只需为您的匿名函数命名,以便您可以按名称调用它。

function runProcess(){
     var todo = items.concat();
     setTimeout(function step() { // give it a name
        process(todo.shift());
        if(todo.length > 0){
           setTimeout(step, 25);  // call it by its name
        } else {
           callback(items);
        }
     }, 25);
}

答案 1 :(得分:1)

函数setInterval应该符合您的需求。

function runProcess(){
     var todo = items.concat(),
         id = setInterval(function(){
                  process(todo.shift());
                  if(todo.length === 0) {
                      clearInterval(id);
                      callback(items);
                  }
              }, 25);
}