如何执行作为参数传递给函数的方法

时间:2011-05-14 10:13:47

标签: javascript invoke method-invocation

我想在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
});

8 个答案:

答案 0 :(得分:80)

您可以将其称为普通功能:

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

唯一额外的事情是提及 context 。如果您希望能够在回调中使用this关键字,则必须进行分配。这通常是理想的行为。例如:

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

在回调中,您现在可以param1访问this。请参阅Function.call

答案 1 :(得分:4)

我也遇到了同样的情况,我必须将作为参数发送的函数调用到另一个函数。

我试过

mainfunction('callThisFunction');

第一种方法

function mainFuntion(functionName)
{
    functionName();
}

但最终会出错。所以我试过

第二种方法

functionName.call(). 

仍然没用。所以我试过

第三种方法

this[functionName]();

像冠军一样工作。所以这只是添加一种调用方式。可能是我的第一和第二种方法可能存在问题,但是谷歌搜索更多,花时间我去了第三种方法。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

object[functionName]();

object:是指对象的名称。

functionName:是一个变量,其值将用于调用函数。

通过将用于引用 [] 中的函数名称的变量和括号外的()放入,我们可以动态调用对象的函数使用变量。点符号不起作用,因为它认为' functionName'是函数的实际名称,而不是' functionName'的值。成立。这让我疯狂了一点,直到我遇到这个网站。我很高兴stackoverflow.com存在< 3

答案 4 :(得分:0)

另一种方法是将您的函数声明为匿名函数并将其保存在变量中:

var aFunction = function () {
};

之后你可以传递一个函数作为参数myfunction并正常调用它。

function myfunction(callbackfunction) {
    callbackfunction();
}

myfunction(aFunction);

但是,正如其他答案所指出的那样,没有必要,因为您可以直接使用函数名称。由于评论中的讨论,我将按原样保留答案。

答案 5 :(得分: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'});

答案 6 :(得分:0)

这里的所有示例似乎都显示了如何声明它,但不是如何使用它。我认为这也是@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 ,这样您就会无意中看到副作用。

答案 7 :(得分:0)

基于上述一些出色的答案和资源,为我的用例提供了超级基本的实现:

/** 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;
}