2014-09-09 2 views
5

다른 인수 중에서도 함수가 될 수있는 두 개의 선택적 인수를 취하는 주어진 함수가 있습니다. 둘 다 선택적이어야하며, 하나는 함수가 될 것이고, 하나는 부울 또는 부울을 반환하는 함수가 될 것입니다.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." 

:

+1

일화로, 이것은 Turing Machines에서 결정할 수없는 정지 문제 (http://en.wikipedia.org/wiki/Halting_problem)에 매우 가깝습니다. :) – lexicore

+0

ㅎ, 좋은 지적을 불러 일으킨다. JS에서 너무 많이 기대하고 있습니다. : P – Meshaal

+0

사용자가 부울을 제공하는 양식과 부울을 반환하는 함수를 호출하는 경우 대신에 개체에 래핑 된 인수를 전달해야합니다. Obj.func (myvar, mystring, myobj, {boolarg : true, funcarg : my_func_that_returns_bool}); 또는 그와 비슷한 것으로, 그것이 무엇인지 모호하지 않게합니다. 그런 다음 사용자는 'my_func_that_returns_bool'이 주장하는대로 수행하는지 확인해야합니다 – Brandin

답변

1

메샬은 문제의 예측을했다. 확실히 간단한 RegExp로는이 작업을 수행 할 수 없습니다. 단지 return !0만이 예를 깰 것입니다.

구문 분석 파서가 가능한 모든 반환 지점을 찾기에 충분히 지능형 인 function.toString()의 결과를 파싱하는 경우 문제는 주로 해결 가능해야합니다.

0

재미있는 질문입니다. 올바르게 이해하면됩니다. 첫째, 나는 그러한 개방적인 주장을하는 것에 대해 경고 할 것입니다. 유스 케이스에 궁금해.

하지만 그렇다고해서 문제를 완전히 해결하기가 쉽지 않습니다. 문제를 완전히 해결하지 못할 수도 있습니다.

이것은 원칙적으로 작동합니다. 그러나, typeof BoolOrFunc()를 실행하는 함수를 실행 ...

해결하기가 쉽습니다. 처음에는 BoolOrFunc이 부울 또는 함수인지 확인합니다 (단지 typeof BoolOrFunc, natch). 부울 인 경우, 우리는 괜찮다고 가정합니다. SecondFunc (undefined) 또는 function이 누락되었거나 오류 상태입니다. 이 첫 번째 경우는 모두 처리하기 쉽습니다.

두 번째 경우는 BoolOrFunc-As-Function이라고 가정합시다. "정말"BoolOrFunc또는SecondFunc이든 관계없이 실행해야합니다. 코드에서 가능한 한 마지막 단계입니다.

이것은 의사 코드 (또는 프로덕션 코드)가 없으면 복잡해집니다. "possible BoolOrFunc"이 true 또는 false을 반환하면 기능 버전이 BoolOrFunc임을 알 것입니다. undefined을 반환하면 방금 SecondFunc이라고 알았습니다. 다시 말하지만, 당신이하려는 일에 따라, 당신은 여기에 있습니다. true 또는 false이있는 경우 "BoolOrFunc-as-function"을 처리해야합니다. 그렇지 않으면 SecondFunc을 호출 했으므로 완료 될 가능성이 큽니다.

함수가 특정 유형을 호출하지 않고 반환하는지 여부를 알려주는보다 일반적인 질문에 대해서는 대답하지 않지만 여기에 제시된대로 사용 사례를 해결합니다.

그러나 우리는 실제 불변의 불변 값return에 처리하는 한,이 더 일반적인 사례 [sic]는 그리 어렵지 않습니다. 이 경우 정규 표현식 경로가 작동합니다 - 모두 return\s+.*;을 찾고 각 뒤에 오는 것이 true 또는 false인지 확인하십시오. 또는 단지 return 총계를 return\s+(false|true);의 총계와 동일하게 비교하십시오. 또는 뭔가. 그리고 기능의 자바 스크립트가 잘 형성되기를 바랍니다. 얼마나 곰이 벌써. 함수가 지역 변수 (return MightBeBoolean; 오히려 return true; 제외) 반환 할 수있는 경우

, 당신은 거의 토스트 것 - 또는 truthiness 또는 falsiness에 동의하면 undefined이 falsey이기 때문에, 당신은 다시 거의 토스트있어, 당신은 할 수 없습니다 BoolOrFunc 또는 SecondFunc의 차이점을 말해주십시오 (항상 "false"를 반환합니다). 필자가 상상할 수있는 합리적인 유스 케이스에서는 파서를 작성할 가치가 있지만, 거의 가치가 없다. 그리고 만약 당신이 그것을하기 위해 lib를 가져오고 있다면, sheesh. 행운을 빕니다. 과장된 행동을하는 것이 과장된 것처럼 보입니다.

인수로 전달 된 함수 자체가 Obj.func의 인수를 전달하면 더 재미 있을지 궁금합니다.

실제 코드가 더 있습니까? ; ^)하지만 궁극적으로 나는 "당신이 질서 정연하다면 어떤 논쟁 거리라도 지나치지 말라"고 권고하고 있습니다. BoolOrFunc/SecondFunc 늦게 평가할 가능성이 높습니다. 그렇지 않으면, 나는 그것을 말하고 싶지 않지만, 조금 더 코드는 여기에 있습니다.

관련 문제