在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++)
);