我正在尝试开发一个带有四个参数的函数
view
(字符串)*最小值参数
(对象)代码
(函数)*最小值回调
(函数)
我希望能够将我能够传递的功能传递到最少的函数中,并在需要时与其他函数一起构建。
例如这些都应该有效
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 语句声明函数并更改它们
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)
}
问题:是否有任何图书馆可以帮助我解决这个问题?
请不要告诉我使用对象来传递所有内容,我已经知道该怎么做了!
最佳答案
Underscore 有一些实用程序可以用来弄清楚你拥有的是什么类型的东西:
- >
_.isString
- >
_.isFunction
- >
_.isObject
你也可以使用 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
所以这种东西很脆弱。
演示:http://jsfiddle.net/ambiguous/94sgp/
我会在现实生活中使用一个对象,命名事物远胜于猜测。
关于javascript - 将函数参数映射到变量(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820663/