Ответ 1
Я думаю, это то, что вы имели в виду.
funct("z", function (x) { return x; });
function funct(a, foo){
foo(a) // this will return a
}
Мне было интересно, законно ли это делать. Могу ли я иметь что-то вроде:
function funct(a, foo(x)) {
...
}
где a
- массив, а x
- целочисленный аргумент для другой функции, называемой foo
?
(Идея состоит в том, чтобы иметь одну функцию, которая использует цикл for для массива и вызывает эту функцию в параметрах для каждого элемента в массиве. Идея заключается в том, чтобы вызвать это на разных функциях, чтобы умножить элементы двух массивов и затем суммы складываются вместе. Например A[0] * B[0] + A[1] * B[1]
.)
Я думаю, это то, что вы имели в виду.
funct("z", function (x) { return x; });
function funct(a, foo){
foo(a) // this will return a
}
Это не способ объявить функцию с другой функцией как один из ее параметров. Это:
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!'
Если вы хотите передать функцию, просто ссылайтесь на нее по имени без круглых скобок:
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"]);
Я бы предпочел создать переменную, как показано ниже:
var deleteAction = function () { removeABC(); };
и передать его как аргумент, как показано ниже:
removeETC(deleteAction);
в методе removeETC выполните это, как показано ниже:
function removeETC(delAction){ delAction(); }
То, что вы упомянули, является законным. Здесь foo(X)
будет вызван, и его возвращаемое значение будет использоваться как параметр метода funct()
И что бы вы хотели достичь? Кажется, вы смешали объявление функции с вызовом функции.
Если вы хотите передать другой результат вызова функции, просто напишите funct(some_array, foo(x))
. Если вы хотите передать другую функцию, напишите funct(some_array, foo)
. Вы даже можете передать так называемую анонимную функцию funct(some_array, function(x) { ... })
.
На самом деле, кажется, немного сложнее, нет.
Получить метод как параметр:
function JS_method(_callBack) {
_callBack("called");
}
Вы можете указать как метод параметра:
JS_method(function (d) {
//Finally this will work.
alert(d)
});