Передача функции в качестве аргумента в функции javascript

Мне было интересно, законно ли это делать. Могу ли я иметь что-то вроде:

function funct(a, foo(x)) {
  ...
}

где a - массив, а x - целочисленный аргумент для другой функции, называемой foo?

(Идея состоит в том, чтобы иметь одну функцию, которая использует цикл for для массива и вызывает эту функцию в параметрах для каждого элемента в массиве. Идея заключается в том, чтобы вызвать это на разных функциях, чтобы умножить элементы двух массивов и затем суммы складываются вместе. Например A[0] * B[0] + A[1] * B[1].)

Ответ 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!'

Итак, второй параметр funct является reference для другой функции (в данном случае foodemo). Как только функция вызывается, она выполняет эту другую функцию (в этом случае с использованием первого параметра для ввода).

Параметры в объявлении функции - это просто метки. Именно функциональное тело дает им смысл. В этом примере funct завершится с ошибкой, если второй параметр не был предоставлен. Поэтому проверка на это может выглядеть так:

function funct(a, foo) {
  if (a && foo && typeof a === 'string' && typeof foo === 'function'){
    alert(foo(a));
  } else {
    return false;
  }
}

Из-за характера JS вы можете использовать прямой вызов функции как параметр в вызове функции (с правильным определением функции):

function funct2(foo){
  alert(foo);
}

funct2(foodemo('world!')); //=> 'hello world!'

Ответ 3

Если вы хотите передать функцию, просто ссылайтесь на нее по имени без круглых скобок:

function funct(a, foo) {
   ...
}

Но иногда вам может понадобиться передать функцию с включенными аргументами, но не вызывать ее до тех пор, пока не будет вызван обратный вызов. Чтобы сделать это, при вызове его просто оберните его анонимной функцией, например:

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

Если вы предпочитаете, вы также можете использовать функцию apply и иметь третий параметр, который является массивом аргументов, например:

function myFunc(myArray, callback, args)
{
    //do stuff with myArray
    //...
    //execute callback when finished
    callback.apply(this, args);
}

function eat(food1, food2)
{
    alert("I like to eat " + food1 + " and " + food2 );
}

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

Ответ 4

Я бы предпочел создать переменную, как показано ниже:

var deleteAction = function () { removeABC(); };

и передать его как аргумент, как показано ниже:

removeETC(deleteAction);

в методе removeETC выполните это, как показано ниже:

function removeETC(delAction){ delAction(); }

Ответ 5

То, что вы упомянули, является законным. Здесь foo(X) будет вызван, и его возвращаемое значение будет использоваться как параметр метода funct()

Ответ 6

И что бы вы хотели достичь? Кажется, вы смешали объявление функции с вызовом функции.

Если вы хотите передать другой результат вызова функции, просто напишите funct(some_array, foo(x)). Если вы хотите передать другую функцию, напишите funct(some_array, foo). Вы даже можете передать так называемую анонимную функцию funct(some_array, function(x) { ... }).

Ответ 7

На самом деле, кажется, немного сложнее, нет.

Получить метод как параметр:

 function JS_method(_callBack) { 

           _callBack("called");  

        }

Вы можете указать как метод параметра:

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