JavaScript 함수를 매개 변수로 전달


665

"부모"함수에서 함수를 실행하거나 사용하지 않고 함수를 매개 변수로 전달하는 방법은 eval()무엇입니까? (나는 그것이 안전하지 않다는 것을 읽은 이래로.)

내가 이거 가지고있어:

addContact(entityId, refreshContactList());

작동하지만 문제는 refreshContactList함수에서 사용될 때가 아니라 함수가 호출 될 때 발생한다는 것입니다.

나는 그것을 사용하여 해결할 수는 eval()있지만 읽은 내용에 따르면 모범 사례는 아닙니다. JavaScript에서 함수를 매개 변수로 전달하려면 어떻게해야합니까?

답변:


930

괄호를 제거하면됩니다.

addContact(entityId, refreshContactList);

그런 다음 먼저 함수를 실행하지 않고 함수를 전달합니다.

예를 들면 다음과 같습니다.

function addContact(id, refreshCallback) {
    refreshCallback();
    // You can also pass arguments if you need to
    // refreshCallback(id);
}

function refreshContactList() {
    alert('Hello World');
}

addContact(1, refreshContactList);

6
@ stevefenton, h2ooooooo 의견으로 답변을 업데이트하는 것이 좋습니다. 매우 유용합니다.
Morgan Wilde

5
질문에 따라 콜백은 매개 변수를 허용하지 않으므로 예제에서 제외했습니다. 그것에 대해 의견을 추가하겠습니다.
Fenton

4
@Veverke 다음과 같이 보일 것입니다.addContact(1, function(id) { console.log(id); });
Fenton

4
@Steve Fenton : 답장을 읽은 후 왜 나에게 물어
봤는가

1
ECMAScript의 클래스 구문에는 =...이 class myFuncs {아닌 부호 가 없습니다 class myFuncs = {. 또한 클래스 구문을 지원하는 환경에서 실행해야합니다 (일부 브라우저에서 아직 지원하지는 않음). 여전히 어려움을 겪고 있다면 문제가 함수 전달에 관한 것이 아니라 일반적인 ES 구문이므로 완전히 새로운 질문에 더 적합 할 수 있습니다.
Fenton 2016 년

338

함수를 전달하려면 괄호없이 이름으로 참조하십시오.

function foo(x) {
    alert(x);
}
function bar(func) {
    func("Hello World!");
}

//alerts "Hello World!"
bar(foo);

그러나 때로는 인수가 포함 된 함수를 전달하고 싶지만 콜백이 호출 될 때까지 호출하지 않을 수도 있습니다. 이렇게하려면 호출 할 때 다음과 같이 익명 함수로 래핑하십시오.

function foo(x) {
   alert(x);
}
function bar(func) {
   func();
}

//alerts "Hello World!" (from within bar AFTER being passed)
bar(function(){ foo("Hello World!") });

원하는 경우 apply 함수를 사용하고 다음과 같이 인수 배열 인 세 번째 매개 변수를 가질 수도 있습니다 .

function eat(food1, food2)
{
    alert("I like to eat " + food1 + " and " + food2 );
}
function myFunc(callback, args)
{
    //do stuff
    //...
    //execute callback when finished
    callback.apply(this, args);
}

//alerts "I like to eat pickles and peanut butter"
myFunc(eat, ["pickles", "peanut butter"]); 

71
또한 인수로 함수를 전달하는 방법도 다루므로 순위가 높아야합니다.
deltanine

3
그리고 이것에 추가 할 것은 JavaScript 기능을 인수 또는 변수 등으로 전달할 수있는이 기능만으로 JavaScript를 강력하고 강력하게 코딩 할 수 있는 기능 이라는 것입니다.
TheHansinator

@ Compynerd255 나는 이것과 객체 리터럴을 빠르게 생성하는 능력이 Javascript에서 가장 좋아하는 두 가지 측면이라는 데 동의합니다. 나는 언어가없는 언어에서 객체 리터럴을 항상 그리워합니다.
dallin

3
이 기능을 제공 한 Javascript와 @dallin에게 감사의 말씀을 전합니다.
Dipendu Paul

"익명 함수로 랩핑"예제의 경우, 명확하지 않은 경우 익명 함수는 함수 자체를 매개 변수와 함께 리턴하며 func ()에서 괄호에 도달하면 호출됩니다. 이것은 알아내는 데 시간이 걸렸으므로 다른 사람들에게 도움이 될 것이라고 생각했습니다.
hubpixel

51

예 1 :

funct("z", function (x) { return x; });

function funct(a, foo){
    foo(a) // this will return a
}

예 2 :

function foodemo(value){
    return 'hello '+value;
}

function funct(a, foo){
    alert(foo(a));
}

//call funct    
funct('world!',foodemo); //=> 'hello world!'

이것 좀봐


첫 번째 예에서 return 키워드를 다음과 같이 추가해야합니다. function funct (a, foo) {return foo (a) // 이것은 반환됩니다} 그렇지 않으면 정의되지 않습니다
Artem Fedotov

34

함수를 매개 변수로 전달하려면 대괄호를 제거하십시오!

function ToBeCalled(){
  alert("I was called");
}

function iNeedParameter( paramFunc) {
   //it is a good idea to check if the parameter is actually not null
   //and that it is a function
   if (paramFunc && (typeof paramFunc == "function")) {
      paramFunc();   
   }
}

//this calls iNeedParameter and sends the other function to it
iNeedParameter(ToBeCalled); 

이것의 기본 개념은 함수가 변수와 매우 유사하다는 것입니다. 쓰는 대신

function ToBeCalled() { /* something */ }

당신은뿐만 아니라 쓸 수 있습니다

var ToBeCalledVariable = function () { /* something */ }

둘 사이에는 약간의 차이가 있지만 어쨌든 둘 다 함수를 정의하는 유효한 방법입니다. 이제 함수를 정의하고 변수에 명시 적으로 할당하면 다른 논리에 매개 변수로 전달할 수 있으며 대괄호가 필요하지 않습니다.

anotherFunction(ToBeCalledVariable);

2
그냥 typeof paramFunc == "function"가 호출되지 않은 경우 충분한, 원인, 당신은 그것을 무시할 수 있습니다.
Jimmy Knoot

16

JavaScript 프로그래머에게는 "Eval is Evil"이라는 문구가 있으므로 모든 비용을 피해야합니다!

Steve Fenton의 답변 외에도 함수를 직접 전달할 수도 있습니다.

function addContact(entity, refreshFn) {
    refreshFn();
}

function callAddContact() {
    addContact("entity", function() { DoThis(); });
}

8

나는 그 문제로 모든 머리카락을 잘랐다. 위의 예제를 작동시킬 수 없으므로 다음과 같이 끝났습니다.

function foo(blabla){
    var func = new Function(blabla);
    func();
}
// to call it, I just pass the js function I wanted as a string in the new one...
foo("alert('test')");

그리고 그것은 적어도 내가 필요한 것에 매력처럼 작동합니다. 그것이 도움이되기를 바랍니다.


6

매개 변수를 배열에 넣은 다음 .apply()함수를 사용하여 분할하는 것이 좋습니다 . 이제 많은 매개 변수가있는 함수를 쉽게 전달하고 간단한 방식으로 실행할 수 있습니다.

function addContact(parameters, refreshCallback) {
    refreshCallback.apply(this, parameters);
}

function refreshContactList(int, int, string) {
    alert(int + int);
    console.log(string);
}

addContact([1,2,"str"], refreshContactList); //parameters should be putted in an array

5

당신은 또한 eval()같은 일을 할 수 있습니다 .

//A function to call
function needToBeCalled(p1, p2)
{
    alert(p1+"="+p2);
}

//A function where needToBeCalled passed as an argument with necessary params
//Here params is comma separated string
function callAnotherFunction(aFunction, params)
{
    eval(aFunction + "("+params+")");
}

//A function Call
callAnotherFunction("needToBeCalled", "10,20");

그게 다야. 나는 또한이 솔루션을 찾고 다른 답변으로 제공된 솔루션을 시도했지만 마침내 위의 예제에서 작동했습니다.


2

여기 또 다른 접근법이 있습니다.

function a(first,second)    
{        
return (second)(first);           
}     

a('Hello',function(e){alert(e+ ' world!');}); //=> Hello world     

2

실제로는 조금 복잡한 것처럼 보이지 않습니다.

매개 변수로 메소드를 가져 오십시오.

 function JS_method(_callBack) { 

           _callBack("called");  

        }

매개 변수 방법으로 제공 할 수 있습니다.

    JS_method(function (d) {
           //Finally this will work.
           alert(d)
    });

1
답을 설명하십시오.
MillaresRoo

2

다른 답변은 진행 상황을 설명하는 훌륭한 일을 수행하지만 중요한 "gotcha"는 전달하는 것이 실제로 함수에 대한 참조인지 확인하는 것입니다.

예를 들어 함수 대신 문자열을 통과하면 오류가 발생합니다.

function function1(my_function_parameter){
    my_function_parameter();   
}

function function2(){
 alert('Hello world');   
}

function1(function2); //This will work

function1("function2"); //This breaks!

JsFiddle 참조


0

이벤트 핸들러를 처리해야 할 때 이벤트를 인수로 전달해야 할 때가 있습니다. 반응과 같은 현대 라이브러리의 대부분은 각도가 필요할 수 있습니다.

reactjs에 대한 일부 사용자 정의 유효성 검사로 OnSubmit 함수 (타사 라이브러리의 함수)를 재정의해야하며 아래처럼 함수와 이벤트를 모두 전달했습니다.

원래

    <button className="img-submit" type="button"  onClick=
 {onSubmit}>Upload Image</button>

새로운 기능을 upload만들고 전달 된 onSubmit이벤트를 인수로 호출

<button className="img-submit" type="button"  onClick={this.upload.bind(this,event,onSubmit)}>Upload Image</button>

upload(event,fn){
  //custom codes are done here
  fn(event);
}

-3

JSON을 사용하여 JS 함수를 저장하고 보낼 수 있습니다.

다음을 확인하십시오.

var myJSON = 
{
    "myFunc1" : function (){
        alert("a");
    }, 
    "myFunc2" : function (functionParameter){
        functionParameter();
    }
}



function main(){
    myJSON.myFunc2(myJSON.myFunc1);
}

'a'가 인쇄됩니다.

다음은 위와 동일한 효과입니다.

var myFunc1 = function (){
    alert('a');
}

var myFunc2 = function (functionParameter){
    functionParameter();
}

function main(){
    myFunc2(myFunc1);
}

다음과 같은 효과가 있습니다.

function myFunc1(){
    alert('a');
}


function myFunc2 (functionParameter){
    functionParameter();
}

function main(){
    myFunc2(myFunc1);
}

그리고 Class를 객체 프로토 타입으로 사용하는 객체 패러다임 :

function Class(){
    this.myFunc1 =  function(msg){
        alert(msg);
    }

    this.myFunc2 = function(callBackParameter){
        callBackParameter('message');
    }
}


function main(){    
    var myClass = new Class();  
    myClass.myFunc2(myClass.myFunc1);
}

9
최고의 코드 예제는 JSON이 아닙니다. 이것은 표준 JavaScript 객체입니다. 또한 JSON에서 함수를 보내거나받을 수 없습니다.
Matthew Layton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.