【发布时间】:2014-09-09 07:56:58
【问题描述】:
我有一个给定的函数,除其他参数外,它还接受两个可能是函数的可选参数。两者都需要是可选的,一个是函数,一个是布尔值或返回布尔值的函数。
// Obj.func(variable, String[, Object][, Boolean||Function][, Function]);
Obj.func = function(other, assorted, args, BoolOrFunc, SecondFunc) {
// execution
};
Obj.func(
[
'some',
'data'
],
'of varying types',
{
and: 'some optional arguments'
},
function() {
if(some condition) {
return true;
}
return false;
},
function() {
// do things without returning
}
);
我希望这两个函数(以及其他几个参数,如果重要的话)都是可选的,这意味着我在函数中有代码来确定用户打算使用哪些参数。
不幸的是,由于两者都可能是函数,并且可以直接在函数调用中指定,我不能简单地使用typeof 或instanceof 条件。但是,由于第一个函数(如果存在)将总是返回一个布尔值(而第二个函数根本不会返回),我的一个想法是检查它的返回值:
if(typeof BoolOrFunc === 'boolean'
|| (typeof BoolOrFunc === 'function' && typeof BoolOrFunc() === 'boolean')) {
// BoolOrFunc is either a boolean or a function that returns a boolean.
// Handle it as the intended argument.
} else {
// Otherwise, assume value passed as BoolOrFunc is actually SecondFunc,
// and BoolOrFunc is undefined.
}
这原则上是可行的;但是,运行 typeof BoolOrFunc() 会执行函数,如果函数不仅仅返回布尔值,则会导致问题:也就是说,如果作为 BoolOrFunc 传递的函数实际上应该是 @987654328 @。 SecondFunc,在这种情况下,是一个回调函数,可能会执行一些我不想立即执行的操作,包括 DOM 修改。
出于这个原因,我的问题是:有没有办法检查函数是否在不执行的情况下返回?
我考虑过的一件事是调用BoolOrFunc.toString(),然后执行正则表达式搜索以查找返回值,类似于……
if(typeof BoolOrFunc === 'boolean'
|| (typeof BoolOrFunc === 'function'
&& BoolOrFunc.toString().search(/return (true|false);/) !== -1)) {
// BoolOrFunc is either a boolean or contains a return string with a boolean.
// Handle it as the intended argument.
}
请注意,上面的代码可能不会像写的那样工作:我实际上并没有为它构建一个测试用例,因为,好吧,它看起来效率非常低并且可能不可靠,我认为这里有人可能有一个更优雅的解决方案我的困境。话虽如此,我想我会把它包括在内以供讨论。
【问题讨论】:
-
顺便说一句,这与图灵机上无法确定的停机问题 (en.wikipedia.org/wiki/Halting_problem) 非常接近。 :)
-
嘿,你提出了一个很好的观点。我可能对 JS 期望太高了。 :P
-
对于用户调用提供布尔值的表单和返回布尔值的函数的情况,您是否可以要求他们传入包装在对象中的参数,例如
Obj.func(myvar, mystring, myobj, {boolarg: true, funcarg: my_func_that_returns_bool});或类似的东西,以明确它是什么。然后用户必须确保my_func_that_returns_bool做它声称的那样
标签: javascript function return conditional