Как выполнить метод, переданный в качестве параметра функции - PullRequest
57 голосов
/ 14 мая 2011

Я хочу написать свою собственную функцию в JavaScript, которая принимает метод обратного вызова в качестве параметра и выполняет его после завершения, я не знаю, как вызвать метод в моем методе, который передается в качестве аргумента.Like Reflection.

пример кода

function myfunction(param1, callbackfunction)
{
    //do processing here
    //how to invoke callbackfunction at this point?
}

//this is the function call to myfunction
myfunction("hello", function(){
   //call back method implementation here
});

Ответы [ 7 ]

82 голосов
/ 14 мая 2011

Вы можете просто вызвать его как обычную функцию:

function myfunction(param1, callbackfunction)
{
    //do processing here
    callbackfunction();
}

Единственное, что следует упомянуть, это упомянуть context . Если вы хотите использовать ключевое слово this в вашем обратном вызове, вам нужно будет его назначить. Это часто желаемое поведение. Например:

function myfunction(param1, callbackfunction)
{
    //do processing here
    callbackfunction.call(param1);
}

В обратном вызове вы теперь можете получить доступ к param1 как this. См Function.call.

4 голосов
/ 10 декабря 2014

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

Я пытался

mainfunction('callThisFunction');

СначалаПодход

function mainFuntion(functionName)
{
    functionName();
}

Но заканчивается ошибками.Поэтому я попытался

Второй подход

functionName.call(). 

Все еще бесполезно.Поэтому я попробовал

Третий подход

this[functionName]();

, который работал как чемпион.Так что это просто добавить еще один способ вызова.Может быть, могут быть проблемы с моим первым и вторым подходами, но вместо того, чтобы гуглить больше и тратить время, я пошел на третий подход.

2 голосов
/ 14 мая 2011
function myfunction(param1, callbackfunction)
{
    //do processing here
   callbackfunction(); // or if you want scoped call, callbackfunction.call(scope)
}
1 голос
/ 21 сентября 2017

object[functionName]();

объект: ссылается на имя объекта.

functionName: - это переменная, значение которой мы будем использоватьдля вызова функции.

, поместив переменную, используемую для ссылки на имя функции внутри [] и () вне скобки, которую мы можем динамически вызыватьФункция объекта с использованием переменной.Точечная нотация не работает, потому что она думает, что «functionName» - это фактическое имя функции, а не значение, которое содержит «functionName».Это немного сводило меня с ума, пока я не наткнулся на этот сайт.Я рад, что stackoverflow.com существует <3 </p>

0 голосов
/ 01 декабря 2016

Кажется, что все примеры здесь показывают, как объявить это, но не как это использовать.Я думаю, именно поэтому @Kiran имел так много проблем.

Хитрость в том, чтобы объявить функцию, которая использует обратный вызов:

function doThisFirst(someParameter,  myCallbackFunction) {
    // Do stuff first
    alert('Doing stuff...');

    // Now call the function passed in
    myCallbackFunction(someParameter);
}

Бит someParameter можно опустить, если не требуется.

Затем вы можете использовать обратный вызов следующим образом:

doThisFirst(1, myOtherFunction1);
doThisFirst(2, myOtherFunction2);

function myOtherFunction1(inputParam) {
    alert('myOtherFunction1: ' + inputParam);
}

function myOtherFunction2(inputParam) {
    alert('myOtherFunction2: ' + inputParam);
}

Обратите внимание, как функция обратного вызова передается и объявляется без кавычек или скобок .

  • Если вы используете doThisFirst(1, 'myOtherFunction1');, это не удастся.
  • Если вы используете doThisFirst(1, myOtherFunction3()); (я знаю, что в этом случае нет ввода параметров), тогда он вызовет myOtherFunction3 first , так что вы получите непреднамеренные побочные эффекты.
0 голосов
/ 17 сентября 2016

Я сделаю что-то вроде этого

var callbackfunction = function(param1, param2){
console.log(param1 + ' ' + param2)
}

myfunction = function(_function, _params){
_function(_params['firstParam'], _params['secondParam']);
}

В основной блок кода, возможно передать параметры

myfunction(callbackfunction, {firstParam: 'hello', secondParam: 'good bye'});
0 голосов
/ 14 мая 2011

Другой способ - объявить вашу функцию как анонимную функцию и сохранить ее в переменной:

var aFunction = function () {
};

После этого вы можете передать aFunction в качестве аргумента myfunction и вызвать его как обычно.1006 * Однако, как указали другие ответы, в этом нет необходимости, поскольку вы можете напрямую использовать имя функции.Я оставлю ответ без изменений из-за обсуждения, которое следует в комментариях.

...