[英]in javascript, same code parsing arguments in different functions - copy or not?
有一系列函数,每个函数都相同地解析它的参数。 现在,这个解析块被剪切并粘贴到每个函数的开头。 有一个更好的方法吗?
Post.update = function( e ) { // parse args var e, el, orig_el, args, render, callBack; for( var i=0; i<arguments.length; i++ ) { if( arguments[i] instanceof HTMLElement ) orig_el = arguments[i]; else if( arguments[i] instanceof Render ) render = arguments[i]; else if( arguments[i] instanceof Event ) { e = arguments[i]; orig_el = orig_el || e.target; } else if( typeof arguments[i] == 'function' ) callBack = arguments[i]; } // Post.update work here } Post.verify = function( e ) { // parse args ... // Post.verify work here }
解析原因而不是单独传递的原因是,有五个+可能的args
我很容易在命令和遗漏中使用一长串args来调用funcs时出错
将一个参数更改为函数意味着更改对func的每个调用
imho一个具有五个参数的函数与通过必要的函数相比是非常难以理解的
所以我的目标是抽象函数的解析部分,同时保持函数调用的清晰度。
而不是从函数中解析5个参数,你应该意识到函数不应该有超过3个参数。
你要做的是让最后一个参数成为一个对象
Post.update = function(ev, obj) {
// obj.el
// obj.render
// obj.ev
// obj.cb
}
然后只需要一个可以重复使用的功能
Post.parseObj = function(obj) {
...
}
Post.update = function(ev, obj) {
obj = Post.parseObj(obj);
}
当然你应该使用一个函数来防止复制和粘贴所有代码!
如果要更改代码中的单个字符,该怎么办? 现在你必须再次复制和粘贴所有内容! 那真的不好。
将该代码粘贴到函数中并每次调用它,这样当您在代码函数中更改某些内容时,更改将反映到使用该函数的每个位置。
你是否担心将这么多参数传递给函数? 你真的要担心,因为传递这么多参数到函数中真的很糟糕。 只需将所有参数都粘贴到单个对象中,然后只将该对象传递给函数,如下所示:
var arg = {
arg1: 'bla bla bla',
arg2: 4,
//.....
};
// call the function passing only one parameter
myFunction( arg );
然后在函数内部你将有一个参数,你可以像这样访问所有其他参数:
function myFunction( arg ) {
// arg.arg1
// arg.arg2 ...
}
定义一次函数并重用它们
var update = function (e) { /* etc */ }
Post.update = update;
为什么不使用Post.parseArgs函数?
Post.parseArgs = function(args)
{
// parse args
var e, el, orig_el, args, render, callBack;
for( var i=0; i<arguments.length; i++ ) {
if( arguments[i] instanceof HTMLElement ) orig_el = arguments[i];
else if( arguments[i] instanceof Render ) render = arguments[i];
else if( arguments[i] instanceof Event ) {
e = arguments[i];
orig_el = orig_el || e.target;
}
else if( typeof arguments[i] == 'function' ) callBack = arguments[i];
}
// return what you want...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.