다른 인수 중에서도 함수가 될 수있는 두 개의 선택적 인수를 취하는 주어진 함수가 있습니다. 둘 다 선택적이어야하며, 하나는 함수가 될 것이고, 하나는 부울 또는 부울을 반환하는 함수가 될 것입니다.JavaScript 함수가 실행되지 않고 반환되는지 확인 하시겠습니까?
// 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
으로 전달 된 함수가 인 경우 실제로는이 SecondFunc
이됩니다. 이 경우 SecondFunc
은 콜백 함수 중 하나이며 즉시 실행하고 싶지 않은 DOM 수정을 포함한 작업을 수행 할 수 있습니다.
이런 이유로 내 질문은 : 함수를 실행하지 않고 반환하는지 확인하는 방법이 있습니까? 내가 생각했던
한 가지는 위의 코드가 기록 된대로 작동하지 않을 수 있음을
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.
}
주 ... 다음 반환 값에 대한 정규 표현식 검색의 라인을 따라 뭔가를 수행 BoolOrFunc.toString()
전화를했다 : 사실, 예외적으로 비효율적이며 잠재적으로 신뢰할 수없는 것처럼 보이기 때문에 실제로 테스트 케이스를 만들지 않았습니다. 여기있는 누군가가 제 문제에 대해보다 세련된 솔루션을 제공 할 수 있다고 생각했습니다. 그것이 말하게되면서, 나는 토론 목적을 위해 그것을 포함 할 것 인 것이라고 상상했다. 우리가 뭔가를 반환 알고 있기 때문에, 함수가 튜링 기계되지 않습니다 예측으로
"... one will either be a boolean or a function that returns a boolean."
"... first function, if it exists, will always return a boolean."
:
일화로, 이것은 Turing Machines에서 결정할 수없는 정지 문제 (http://en.wikipedia.org/wiki/Halting_problem)에 매우 가깝습니다. :) – lexicore
ㅎ, 좋은 지적을 불러 일으킨다. JS에서 너무 많이 기대하고 있습니다. : P – Meshaal
사용자가 부울을 제공하는 양식과 부울을 반환하는 함수를 호출하는 경우 대신에 개체에 래핑 된 인수를 전달해야합니다. Obj.func (myvar, mystring, myobj, {boolarg : true, funcarg : my_func_that_returns_bool}); 또는 그와 비슷한 것으로, 그것이 무엇인지 모호하지 않게합니다. 그런 다음 사용자는 'my_func_that_returns_bool'이 주장하는대로 수행하는지 확인해야합니다 – Brandin