在我的程序中,用户提供一个数组,用于定义循环中运行的函数。我有一堆必须传递给每个函数的变量。由于参数列表出现在许多地方,因此该列表似乎一直在增长并且变得难以维护。这是一些伪代码:
var fn_defs = {
test_fn_1: function(test_var_1, test_var_2, test_var_3, test_var_4, test_var_5, cb){
//...do stuff
},
test_fn_2: function(test_var_1, test_var_2, test_var_3, test_var_4, test_var_5, cb){
//...do stuff
},
etc...
};
async.eachSeries(user_defined_list_of_function_names, function(fn, async_cb){
var test_var_1, test_var_2, test_var_3, test_var_4, test_var_5;
fn_defs[user_defined_list_of_function_names](test_var_1, test_var_2, test_var_3, test_var_4, test_var_5, function(result){
async_cb();
}, function(err){
//end
});
});
寻找更好的方法来做到这一点。我想我可以制作全局变量,但我想这也是一种反模式。
答案 0 :(得分:2)
这种模式(函数的许多参数)在javascript中很常见。流行的JavaScript库中的许多函数都有很多参数。它们将这些参数括在一个对象中,该对象收集一个参数中的所有参数,并简化了给出可选参数。
例如,JQuery UI animate function,需要11个参数。所有参数都封装在一个对象中。传递缺少参数的对象将使用此参数默认值。
function dostuff(args){
var def_args = {step: 1, state: 'PENDING', vas: function(){}};
args = merge_options(def_args, args);
}
答案 1 :(得分:1)
如果您使用的是内部界面,则可以使用DTO(http://en.wikipedia.org/wiki/Data_transfer_object)进行总结,您可以创建一个简单的对象来对所有变量进行分组。