我正在尝试开发一个带有四个参数的函数
view
(字符串)* minimum params
(对象)code
(功能)*最低callback
(功能)我希望能够通过我能够通过的最少量的功能,并在需要时与其他功能建立起来。
例如,这些都应该起作用
myFunction("enter", {"hello": "world"}, function(x){return x}, function(err, result){});
myFunction("enter", function(x){return x}});
myFunction("enter", {"hello": "world"}, function(x){return x}});
myFunction("enter", {"hello": "world"});
可以理解最后两个参数是函数我必须选择一个作为优先级。最后一个不是必需的,所以这永远不可能:
myFunction("enter", {"hello": "world"}, function(err, result){});
如果有一个函数参数myFunction
会假设/优先考虑其中一个。该应用程序将处理错误。
这是我尝试过的,这是一个很头疼的问题。
如果声明声明功能并更改它们
if(!arguments[0]) view = arguments[0];
if(!arguments[1]) params = arguments[1];
if(!_.isObject(arguments[1])){
params = false;
code = arguments[1];
callback = arguments[2];
};
每个参数的功能
var view = function(){
if(!arguments[0]) return false;
return arguments[0];
}();
var params = function(){
if(!arguments[1]) return false;
if(!_.isObject(arguments[1])) return false;
return arguments[1];
}();
var code = function(){
if(!arguments[1]) return false;
if(!params) return arguments[1];
if(!arguments[2]) return false;
return arguments[2];
}();
var callback = function(){
//if(!arguments)
}
问题:那里有没有可以帮助我的图书馆?
请不要告诉我使用对象传递所有内容,我已经知道该怎么做了!
答案 0 :(得分:1)
Underscore有一些实用工具可以试图弄清楚你有什么样的东西:
如果您愿意,也可以使用typeof
和instanceof
测试。然后你可以使用Function.length
来尝试区分函数参数。
这样你就可以用这样简单的东西来解析arguments
:
var view, params, code, callback, arg;
for(var i = 0; i < arguments.length; ++i) {
arg = _(arguments[i]);
if(arg.isString())
view = arguments[i];
else if(arg.isFunction() && arguments[i].length === 1)
code = arguments[i];
else if(arg.isFunction() && arguments[i].length === 2)
callback = arguments[i];
else if(arg.isObject())
params = arguments[i];
else
throw 'WTF is argument ' + i + ' all about?';
}
您可以根据需要调整测试(特别是length
检查),您可能需要单独测试以确保指定了所需的参数。当然,这不需要任何特定的参数顺序,但它确实期望完全按照要求指定函数;请注意,许多函数包装工具(_.bind
,$.proxy
,CoffeeScript的=>
,...)将会执行length
这样的事情,所以这类事情非常脆弱。< / p>
演示:http://jsfiddle.net/ambiguous/94sgp/
我在现实生活中使用一个物体,命名的东西远远超过猜测。