2014-12-02 2 views
-2

javascript gurus! 나는이 질문에 대한 제목이 다소 혼란 스러울 수도 있음을 알고 있습니다. 그러나 나는 그것을 어떻게 설명하는지 잘 모른다. 함수가 다른 함수의 인수로 호출되는지 어떻게 알 수 있습니까?

그래서 내가 그냥 예를 들어 줄 수 있습니다 : 그것은 그것의 자신의 호출 것처럼 아닌 다른 함수의 인자로 불리는 경우

function foo(txt){ 
    return "Hello " + txt); 
} 
function bar(txt){ 
    if(/* bar is called as an argument */) return txt; 
    if(/* bar is called normally */) return "Bar"; 
} 

foo(bar("world!")); //Returns "Hello World"; 
bar("world!");  //Returns "Bar"; 

나는 다른 무언가를 할 수있는 바() 할 수 있습니다.

bar()가 다른 함수의 인자인지 아닌지를 알 수없는 것처럼 보입니다. 브라우저가 foo (bar ("world!"))를 실행할 때 보이기 때문입니다. bar ("world!")를 먼저 실행 한 다음 bar()의 결과가 무엇이든간에 foo()를 제공합니다.

나는 foo()가 호출하고 있다고 생각했기 때문에 bar() 호출 스택을 확인할 수 있다고 생각했다. 하지만 foo()가 호출되기 전에 foo()와 같은 함수에 의해 호출됩니다.

나는 이런 느낌이 들기 시작했다.

편집 : 분명히 대부분의 사람들은 왜 내가 이것을하고 싶어하는지 혼란 스럽습니다.

저는 직접 HTML 요소를 작성하는 기능을 제공합니다. 나는 함수를 호출 그냥 내가 그들에 첨부 할 부모 요소와 태그 이름의 무리를 전달하며 해당 태그를 만들고이 3 개 세포를 만들 것이다 부모 요소

obj = c(tableElement,"td","td","td") 

로 추가 할 수 있습니다 그들을 내 식탁에 붙이세요. 그러나 아무것도 돌려주지 않을 것이다. 그래서 :

obj = undefined 

하지만이 원래 코드를 변경하는 경우 becuase 그 괜찮아 :

obj = c(tableElement,"td","td",true,"td") 

다음은 같은 일을 할 것입니다. 대신 obj에 두 번째 셀을 전달하여 나중에 해당 셀을 쉽게 다시 사용할 수 있습니다.

자바 스크립트를 사용하여 나중에 대부분 조작 할 필요가없는 것들을 많이 만들 때 편리합니다.

요소를 중첩하는 기능을 추가하기 전까지는 모두 잘 작동합니다. EX : 이것은 실제로 잘 작동

obj = c(tableElement,"tr",c("td",true,"td",true,"td",true),"tr",true) 

출력한다 :

<table> 
    <tr> 
     <td></td> 
     <td></td> 
     <td></td> 
    </tr> 
    <tr></tr> 
</table> 

와 OBJ = 번째 행 요소 만.

이제 모든 것을 수행하려고하는 속임수입니다. 내 중첩 c() 함수에서 TRUE 인수가 필요하지 않습니다. 그들은 무엇이든지간에 요구되기 때문에 필요하지 않습니다. 내가 알기 위해 어떤 방법을 가졌다면 중첩 된 것입니다. 그러면 참된 인수를 무시할 수 있고 코드가 훨씬 간결해질 것입니다.

중첩 된 셀 중 하나를 obj 변수에도 반환 할 수 있어야합니다.

내 유일한 옵션은 임베디드 요소 작성자로 사용하기 위해 조금 다르게 작동하는 두 번째 기능을 만드는 것입니다.

+2

하지만 함수를 인수로 전달하지 않고 함수를 호출하고 인수로 반환 된 문자열을 전달하면 괄호를 추가하면 함수를 인수로 전달할 수 있습니다 do'foo (bar); – adeneo

+1

왜 이렇게하고 싶지는 모르겠다. – soktinpk

+1

지금 당장은 그것을 얻을 수있을 것입니다. 그리고 그럴 수는 없지만,'bar' 함수는 함수 foo와 관련하여 어떤 식 으로든 호출되는 것을 전혀 모릅니다. – adeneo

답변

0

함수 호출의 컨텍스트를 확인하려면 Function.caller (arguments.caller 대신 사용)을 사용할 수 있습니다. 함수 호출 모두 같은 레벨의 코드로 만든되기 때문에 (호출이 최상위 코드에서 인 경우 또는 null)

function bar() { 
    console.log(bar.caller); 
} 

그러나, 그들은 동일한 결과를 반환합니다.
따라서 원하는 것은 불가능합니다. 또한, 당신이 이것을하려고합니까?

1

당신이 원하는 것은별로 의미가 없습니다. 함수 프로그래밍의 핵심 원리는 함수 실행이 함수 실행 중에 제공되는 매개 변수만을 기반으로한다는 것입니다. 이 두 함수를 구별하려면 함수의 어떤 부분을 호출해야 하는지를 알려주는 추가 매개 변수를 제공해야합니다. 귀하의 상황에서 나는 다음과 같은 것을 상상할 것입니다 :

function foo(txt){ 
    return "Hello " + txt); 
} 

function bar(argument,txt){ 
    if(argument) return txt; 
    else return "Bar"; 
} 

foo(bar(true,"world!")); //Returns "Hello World"; 
bar(false,"world!");  //Returns "Bar"; 

나는 당신의 특별한 상황에서의 문제를 해결할 것이라고 생각합니다.

UPDATE :

그럼 난 당신의 문제를 이해하지만,이 방법 당신은 당신이 훨씬 이해가되지 않습니다 해결하기 위해 노력하고 있습니다. 내가 소개하려고하는이 솔루션이 현명한 방법으로 확장되지 않는다는 것을 바로 알 수 있습니다. 자바 스크립트에서 HTML 문서를 만드는 것은 일반적으로 좋지 않습니다. http://handlebarsjs.com/을 사용해 보시고 많은 시간을 절약하십시오.

관련 문제