71

コールバックメソッドをパラメーターとして受け取り、完了後に実行する独自の関数を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
});
4

8 に答える 8

103

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

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

唯一の余分なことは、コンテキストに言及することです。コールバック内でキーワードを使用できるようにする場合は、thisキーワードを割り当てる必要があります。これはしばしば望ましい振る舞いです。例えば:

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

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

于 2011-05-14T10:16:59.710 に答える
8

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

私は試した

mainfunction('callThisFunction');

最初のアプローチ

function mainFuntion(functionName)
{
    functionName();
}

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

2番目のアプローチ

functionName.call(). 

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

3番目のアプローチ

this[functionName]();

チャンピオンのように機能しました。つまり、これは呼び出し方法をもう1つ追加することです。私のファーストアプローチとセカンドアプローチに問題があるかもしれませんが、代わりにもっとグーグルして、サードアプローチに時間を費やしました。

于 2014-12-10T06:49:51.830 に答える
2
function myfunction(param1, callbackfunction)
{
    //do processing here
   callbackfunction(); // or if you want scoped call, callbackfunction.call(scope)
}
于 2011-05-14T10:17:19.520 に答える
1

ここにあるすべての例は、それを宣言する方法を示しているように見えますが、それを使用する方法は示していません。@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 最初に呼び出されるため、意図しない副作用が発生します。
于 2016-12-01T18:05:42.250 に答える
1

object[functionName]();

オブジェクト:オブジェクトの名前を参照します。

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

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

于 2017-09-21T02:39:56.267 に答える
0

もう1つの方法は、関数を無名関数として宣言し、変数に保存することです。

var aFunction = function () {
};

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

function myfunction(callbackfunction) {
    callbackfunction();
}

myfunction(aFunction);

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

于 2011-05-14T10:18:46.707 に答える
0

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

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'});
于 2016-09-16T21:57:15.943 に答える
-1

上記のいくつかの優れた回答とリソースに基づく、私のユースケースの超基本的な実装:

/** Returns the name of type member in a type-safe manner. **(UNTESTED)** e.g.:
*
* ```typescript
* nameof<Apple>(apple => apple.colour); // Returns 'colour'
* nameof<Apple>(x => x.colour); // Returns 'colour'
* ```
*/
export function nameof<T>(func?: (obj: T) => any): string {
 const lambda = ' => ';
 const funcStr = func.toString();

 const indexOfLambda = funcStr.indexOf(lambda);
 const member = funcStr.replace(funcStr.substring(0, indexOfLambda) + '.', '').replace(funcStr.substring(0, indexOfLambda) + lambda, '');

 return member;
}
于 2020-02-07T04:42:35.080 に答える