JavaScript 함수를 매개 변수로 전달 때가 아니라 함수가 호출 될 때

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

내가 이거 가지고있어:

addContact(entityId, refreshContactList());

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

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



답변

괄호를 제거하면됩니다.

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);


답변

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

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"]); 


답변

예 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!'

이것 좀봐


답변

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

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);


답변

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

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

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

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


답변

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

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')");

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


답변

매개 변수를 배열에 넣은 다음 .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