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

在javascript中声明存储在函数数组中的函数时,为变量赋值,javascript,arrays,function,Javascript,Arrays,Function,在将函数添加到函数数组之前,在函数变量中存储值的最佳做法是什么 例如,我们有一个计数器: var f_counter = 0; 。。。我们有一个函数数组: var a_func = []; var l = a_func.length; while (l>0) { var fnc=a_func[l-1]; fnc(); l--; } 在向数组中添加函数时,可以执行以下操作: a_func.push( function(){ examplecal

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

例如,我们有一个计数器:

var f_counter = 0;
。。。我们有一个函数数组:

var a_func = [];
var l = a_func.length;
while (l>0) {
    var fnc=a_func[l-1];
    fnc();
    l--;
}
在向数组中添加函数时,可以执行以下操作:

a_func.push(
   function(){
      examplecallbackfunction(f_counter);
   }
);
f_counter++;
下面是回调函数的示例:

function examplecallbackfunction(c) {
<... code ...>
}
这里的问题是,在执行函数数组时,参数f_计数器是当前全局变量f_计数器的值,而不是单个函数添加到函数数组时的f_计数器的值

在将f_计数器的当前值分配给函数数组之前,我需要在函数定义中存储f_计数器的当前值,并且在迭代和执行数组中的函数时,它应该使用存储的值调用回调函数


我需要一种不将单个值存储在全局变量中的方法来实现这一点,因为我根据用户交互异步加载东西,所以我永远不会“提前”知道将存储在函数数组中的函数的数量和类型。有些函数的变量可能比f_计数器的变量多,等等…

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

这是您的代码,其中包含一个附加函数;没有测试,但你应该知道:

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

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

a_func.push({counter:counter, f:function(arg){}});
要调用队列(移位)/堆栈(pop),请执行以下操作:


第一种方法是使用闭包(函数返回一个将变量复制到其作用域的函数)。这是一个描述了很多次的技巧,无需重复,只需编写代码即可

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,它将不起作用,因为对象是通过引用传递的。

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

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

伟大的谢谢你,这看起来很有希望,而且是一个简单的方法,正是我想要的!非常感谢。类似于tau的建议,这是我将使用的方法非常有趣的建议!我会看一看这个,看看当我在同一个数组中添加了非常不同的函数时,我是否可以使用它,也许有一个版本是可能的,但我不确定。它当然适合我的例子,但我相信在实践中使用它会增加复杂性
a_func.push(
    (function(i) {
        return function() { examplecallbackfunction(i); }
    })(f_counter++)
);