将函数推入数组 - 循环通过和拼接?

时间:2012-09-24 19:40:03

标签: javascript arrays push

使用Javascript我需要能够:

1:将一定数量的相同功能(每个参数中的参数不同)推入数组。

2:然后逐个运行每个函数(本例中只是参数/数字的警告)

3:在每个函数之后,我需要能够从数组中SPLICE那个函数

4:每次检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成

现在我似乎能够完成任务1,2和4但是我在运行后如何从数组中拼出功能 - 有人能帮忙吗?由于我无法删除该功能,因此一旦调用所有功能,我就永远无法获得“完成”警报

到目前为止我的javascript代码是:

// Create empty array
var array = [];

// Push functions into array - dynamic amount and could be any amount of functions
array.push(func(1));
array.push(func(2));
array.push(func(3));

// Call array manager function after pushing array
arrayManager();

// Array manager function to splice and detect when finished
function arrayManager() {
    if (array.length < 1) {
        alert("done");
    }
    else {
    //////////////////////////////////
    // << THIS IS WHERE I DON'T KNOW HOW TO SPLICE THE ITEM FROM THE ARRAY
    //////////////////////////////////
    }
}

// Function for array objects - alert passed parameter
function func(num){
    alert(num);
}

5 个答案:

答案 0 :(得分:14)

首先,你不是要将函数推入数组,而是执行func。要实现推送,你的func应如下所示:

// Function for array objects - alert passed parameter
function func(num){
  return function(){
    alert(num);
  }
}

现在,如果你的函数是同步的,你可以简单地迭代数组

for(var i in arr){
  arr[i]();
}
console.log('done');

如果我们正在处理异步函数,那么他们需要进行回调:

// Function for array objects - alert passed parameter
function func(num){
  return function(callback){
    alert(num);
    callback();
  }
}

然后你可以使用计数器并行运行。

var count = arr.length;
for(var i in arr){
  arr[i](function(){
    if(--count === 0){
      console.log('Done');
    }
  });
}

或按顺序:

function run(){
  var fn = arr.shift();
  if(!fn){
    console.log('Done');
  } else {
    fn(run);
  }
}
run();

答案 1 :(得分:1)

这应该做你想要的:

var next_func = array.splice(0, 1)[0]

“splice”至少需要两个参数:第一个是开始删除的索引,第二个是要删除的项目数。当它返回一个新数组时,只需获取该函数,就可以从拼接中获得第一个值。在前两个参数之后,您还可以添加任意数量的值;这些将被添加到数组中以代替您删除的内容。

然而,我很好奇为什么你这样做 - 虽然我能理解以非常规方式做一些事情作为一种智力练习,如果你是编程的新手,我会说有一个更好的方法这个。当您使用它中的函数时,没有特别需要从数组中删除项目。对我来说,从数组中执行每个函数更有意义,然后在完成循环后设置“array = []”。然而,根据情况,这可能仍然是你做你正在做的事情的最佳方式,我只是觉得我会给你一些思考。

答案 2 :(得分:1)

// Create empty array
var array = [];

// Push functions into array - dynamic amount and could be any amount of functions
array.push(function() { func(1); });
//if you call array.push(func(1)) the function is executed immediatly
//then null is stored in the array
array.push(function() { func(2); });
array.push(function() { func(3); });

// Call array manager function after pushing array
arrayManager();

// Array manager function to splice and detect when finished
function arrayManager() {
    while (array.length){
        var fnc=array.splice(0,1)[0]
        fnc();
    }
    alert ("done");            
}

// Function for array objects - alert passed parameter
function func(num){
    alert(num);
}​

答案 3 :(得分:1)

这是你需要的吗?

1:将一定数量的相同功能(每个参数中的参数不同)推入数组。

function func(num){
    alert(num);
}

var k = [];
k.push({f:func, params:[1]});
k.push({f:func, params:[2]});
k.push({f:func, params:[3]});

2:然后逐个运行每个函数(本例中只是参数/数字的警告)

3:在每个函数之后,我需要能够从数组中SPLICE那个函数

4:每次检查数组长度 - 一旦数组再次为空 - 提醒用户它已完成

while (k.length > 0) {
 k[0].f(k[0].params);
 k.shift();
}
alert("done");

答案 4 :(得分:0)

http://jsfiddle.net/nZ459/1/

如果你想以你正在做的方式推送每个函数及其参数,你必须像这样包装函数:

function wrapper(arg){
    return function(){
        console.log(arg);
    };
}


var ar = [];

console.log("pushing functions");

ar.push(wrapper(1));
ar.push(wrapper(2));
ar.push(wrapper('three'));

console.log("done pushing functions");

while (ar.length){
    var fn = ar.shift();
    console.log("calling ", fn);
    fn();
}

或者,您可以创建一个通用包装器,它接受一个函数,参数作为参数,并返回一个匿名函数。

要更直接地回答您的问题,以您希望的方式运行数组的最简单方法是:

while (array.length){
    var item = array.shift();
    ...
}