在javascript中声明存储在函数数组中的函数时,为变量赋值

时间:2014-03-31 17:54:31

标签: javascript arrays function

在将函数添加到函数数组之前,在函数变量中存储值的最佳(或良好)做法是什么?

例如,我们有一个柜台:

var f_counter = 0;

...我们有一个函数数组:

var a_func = [];

当我们向数组添加一个函数时,我们可以这样做:

a_func.push(
   function(){
      examplecallbackfunction(f_counter);
   }
);
f_counter++;

以下是示例回调函数:

function examplecallbackfunction(c) {
<... code ...>
}

循环执行函数数组:

var l = a_func.length;
while (l>0) {
    var fnc=a_func[l-1];
    fnc();
    l--;
}

这里的问题是,当执行函数数组时,参数f_counter是当前的全局变量f_counter,而不是将各个函数添加到函数数组时的f_counter。

我需要一个很好的做法,在将f_counter的当前值存储到函数定义中之前将其存储在函数定义中,并且当迭代并执行数组中的函数时,它应该例如使用存储的值调用回调函数

我需要一种方法来做到这一点,而不是将各个值存储在全局变量中,因为我根据用户交互加载异步,所以我从来不知道&#34;提前&#34;将存储在函数数组中的函数的数量和类型。有些函数可能有比f_counter更多的变量,依此类推......

4 个答案:

答案 0 :(得分:1)

将函数包装在将函数推入数组时执行的函数中。这将形成围绕该变量的额外闭包。现在闭包是围绕全局变量,所以当函数实际执行时,该全局变量可能不是函数被推入循环时的那个。

这是你的代码,附带一个额外的功能;没有测试它,但你应该明白这个想法:

a_func.push(
   (function(counter){
      function() {
          examplecallbackfunction(counter);
      }
   })(f_counter) //execute function immediately
);
f_counter++;

答案 1 :(得分:1)

第一种方法是使用闭包(函数返回一个函数,在该函数中将变量复制到其作用域)。这是一个很多次描述不需要重复的技巧,所以只需要代码

var data = 1;
var wrong = function() { console.info(data); };
var right = (function(properval) { 
    return function() { console.info(properval); };
})(data);
data = 2;
wrong(); // 2 in console
right(); // 1 in console

第二种方法是推送你的数组不是函数,而是像

这样的对象
a_func.push({
   callback: function(input) { console.info(input); },
   value: f_counter
});

并在循环中使用它

var data = a_func[l-1];
data.callback(data.value);

由于你的计数器是标量,它将被val复制到object。注意:如果value是object,它将不起作用,因为对象通过引用传递。

答案 2 :(得分:1)

您可以每次创建一个函数,将计数器作为参数传递。 此外,您可以在传递时使用f_counter ++,因此每次都会递增计数器。

a_func.push(
    (function(i) {
        return function() { examplecallbackfunction(i); }
    })(f_counter++)
);

答案 3 :(得分:0)

没有闭包的简单方法是简单地在数组中存储一个对象:

a_func.push({counter:counter, f:function(arg){}});

召回你的队列(轮班)/堆叠(pop):

while(obj=a_func.shift()){ obj.f(obj.counter); }