2014-03-31 46 views
1

在将函数添加到函数数组之前,将值存储在函数变量中的最佳(或优良)做法是什么?当声明函数存储在一个函数数组中的函数值时,为变量赋值value

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

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的当前值存储在函数定义中,然后将其分配给函数数组,并且在迭代和执行数组中的函数时,它应该使用该值调用回调函数存储。

我需要一种方法来做到这一点,而不需要将各个值存储在全局变量中,因为我根据用户交互加载了一些异步,所以我从不知道“事先”会存储多少个以及哪种类型的函数函数数组。某些函数可能会有比f_counter更多的变量,等等......

回答

1

将函数包装到函数中,该函数被推入数组中。这将围绕该变量形成额外的闭包。现在闭包围绕着全局变量,因此在实际执行该函数时,该全局变量可能不是当函数被压入循环时的情况。

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

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

太好了!谢谢你,这看起来很有前途,而且方法简单,正是我期待的! – Plarsen

0

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

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

记得您的队列(移)/stack(pop):

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

非常有趣的建议!我会看看这个,看看我是否可以使用它,当我有非常不同的功能添加到相同的阵列,也许这是可能的版本,但我不知道。它确实套装我的例子,但我相信在实践中使用时复杂性会增加 – Plarsen

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反对。注意:如果value是对象,它将不起作用,因为对象是通过引用传递的。

+0

伟大的解释!谢谢! – Plarsen

1

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

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

谢谢!与tau的建议类似,这是我将使用的方法 – Plarsen

相关问题