在将函数添加到函数数组之前,在函数变量中存储值的最佳(或良好)做法是什么?
例如,我们有一个柜台:
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更多的变量,依此类推......
答案 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); }