web-dev-qa-db-ja.com

関数にパラメーターとして渡されたメソッドを実行する方法

JavaScriptでコールバックメソッドをパラメーターとして受け取り、完了後に実行する独自の関数を作成したいのですが、引数として渡されたメソッドでメソッドを呼び出す方法がわかりません。リフレクションのような。

サンプルコード

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
});
58
Muhammad Ummar

通常の関数として呼び出すことができます:

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

唯一の余分なことは、contextに言及することです。コールバック内でthisキーワードを使用できるようにするには、それを割り当てる必要があります。これは頻繁に望ましい動作です。例えば:

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

コールバックで、thisとしてparam1にアクセスできるようになりました。 Function.call を参照してください。

82
lonesomeday

私も同じシナリオに入り、別の関数にパラメーターとして送信された関数を呼び出さなければなりません。

私は試した

mainfunction('callThisFunction');

最初のアプローチ

function mainFuntion(functionName)
{
    functionName();
}

しかし、エラーになります。だから私は試した

第二のアプローチ

functionName.call(). 

まだ役に立たない。だから私は試した

第三のアプローチ

this[functionName]();

それはチャンピオンのように働きました。したがって、これは呼び出し方法をもう1つ追加することです。私の最初のアプローチと2番目のアプローチに問題があるかもしれませんが、代わりにもっとグーグルで時間をかけて3番目のアプローチに行きました。

4
Kiran
function myfunction(param1, callbackfunction)
{
    //do processing here
   callbackfunction(); // or if you want scoped call, callbackfunction.call(scope)
}
2
Roki

object[functionName]();

object:は、オブジェクトの名前を指します。

functionName:は、関数の呼び出しに使用する値を持つ変数です。

関数名を参照するために使用される変数を[]内および()内に配置することにより、変数を使用してオブジェクトの関数を動的に呼び出すことができます。 「functionName」は関数の実際の名前であり、「functionName」が保持する値ではないと考えるため、ドット表記は機能しません。このサイトに出くわすまで、これは少し夢中になりました。 stackoverflow.comが存在する<3

1
Moises D

別の方法は、関数を匿名関数として宣言し、変数に保存することです:

var aFunction = function () {
};

その後、aFunctionを引数myfunctionとして渡し、通常どおり呼び出すことができます。

function myfunction(callbackfunction) {
    callbackfunction();
}

myfunction(aFunction);

ただし、他の回答が指摘しているように、関数名を直接使用できるため、必要ありません。コメントに続く議論のため、私は答えをそのままにします。

0
stivlo

私はこのようなことをします

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
jcromeros1987

ここでの例はすべて、宣言方法を示しているように見えますが、使用方法は示していません。それが、@ Kiranが多くの問題を抱えていた理由でもあると思います。

秘Theは、コールバックを使用する関数を宣言することです。

_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
SharpC