Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何执行作为参数传递给函数的方法_Javascript_Invoke_Method Invocation - Fatal编程技术网

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

Javascript 如何执行作为参数传递给函数的方法,javascript,invoke,method-invocation,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 myfun

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

您可以将其作为普通函数调用:

function myfunction(param1, callbackfunction)
{
    //do processing here
    callbackfunction();
}
唯一额外的事情是提到上下文。如果您希望能够在回调中使用
this
关键字,则必须分配它。这通常是可取的行为。例如:

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

在回调中,您现在可以作为
this
访问
param1
。请参阅。

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

var aFunction = function () {
};
之后,您可以将函数作为参数myfunction传递并正常调用它

function myfunction(callbackfunction) {
    callbackfunction();
}

myfunction(aFunction);

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

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

我试过了

第一种方法

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

第二种方法

还是没用。所以我试过了

第三种方法


就像冠军一样。所以这只是增加了一种呼叫方式。我的第一种和第二种方法可能有问题,但我更多地用谷歌搜索,花时间使用第三种方法

我会做这样的事情

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'});

这里的所有示例似乎都说明了如何声明它,但没有说明如何使用它。我想这也是@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
    ,这样你会得到意想不到的副作用
对象[函数名]()

对象:指对象的名称

functionName:是一个变量,我们将使用它的值来调用函数


通过将用于引用函数名的变量放在[]内,将()放在括号外,我们可以使用该变量动态调用对象的函数。点表示法不起作用,因为它认为“functionName”是函数的实际名称,而不是“functionName”所包含的值。这让我有点疯狂,直到我看到这个网站。我很高兴stackoverflow.com基于上面的一些优秀答案和资源为我的用例提供了超基本的实现:

/** 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;
}
/**以类型安全的方式返回类型成员的名称**(未经测试)**例如:
*
*```打字脚本
*名称(苹果=>apple.color);//返回“颜色”
*名称(x=>x.color);//返回“颜色”
* ```
*/
导出函数名(func?:(obj:T)=>any):字符串{
常数lambda='=>';
常量funcStr=func.toString();
常量indexOfLambda=funcStr.indexOf(lambda);
常量成员=funcStr.replace(funcStr.substring(0,indexOfLambda)+','')。replace(funcStr.substring(0,indexOfLambda)+lambda',);
返回成员;
}

你能告诉我更多关于作用域调用的信息吗?@Ummar:“作用域”这个词用错了,@Roki所说的是调用中的
这个
值是什么。您可以通过使用
call
(或
apply
)明确确定
调用函数中的
内容。不过,这与范围无关。通常的术语是“上下文”(例如,设置调用的上下文)。他有权利。默认情况下,全局函数中的执行“上下文”是窗口,但如果要更改,可以使用不同的对象调用函数。这个问题是关于
myfunction
如何调用传递到其中的回调,而不是作为回调调用
myfunction
。但即使是这样,也没有任何理由让这个函数匿名。您可以使用符号
myfunction
以任何方式引用该函数。(并使其匿名。)好的,我已经编辑了这个问题以交换名称,我正在阅读你的文章,感谢你的指针。再说一次:你不需要将
callbackfunction
函数匿名以将其用作回调。(如果你愿意,也可以,但不必如此。)你的回答仍然给人一种强烈的印象。它还使用了两个不同的
callbackfunction
符号(其中一个是变量,另一个是函数参数),这让人很困惑。@T.J.Crowder我明白了你关于匿名函数的观点,不过我不打算在我的答案中改变这一点,因为已经有其他答案显示了另一种方式。它已经被否决了,所以它一直被否决,我同意。关于如何组织JavaScript类并允许私有方法的文章非常有趣。我将在我的代码中尝试它。我添加了一些注释,这是一种替代方法,并指出了注释中的讨论,因此现在应该更清楚了。如果将函数作为参数传递,如main函数(callThisFunction);而不是作为一个字符串。但无论如何,是的,你有第三种方法:)这是一种有用的技术,但它与这个问题相关吗?传递的是一个函数对象,而不是一个方法名……如果我想在调用myfunction时向回调函数传递一个参数,该怎么办?例如,
myfunction(“hello”,functi
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'});
function doThisFirst(someParameter,  myCallbackFunction) {
    // Do stuff first
    alert('Doing stuff...');

    // Now call the function passed in
    myCallbackFunction(someParameter);
}
doThisFirst(1, myOtherFunction1);
doThisFirst(2, myOtherFunction2);

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

function myOtherFunction2(inputParam) {
    alert('myOtherFunction2: ' + inputParam);
}
/** 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;
}