19

这个问题看起来像是重复的,因为标题几乎是重复的。但是,我的问题似乎更简单,我找不到答案。

我有一个执行另一个回调函数的 Javascript 函数,它的工作原理是这样的:

<script type='text/javascript'>
firstfunction(callbackfunction);
</script>

其中回调函数定义为:

callbackfunction(response) {
    if (response=='loggedin'){
    // ... do stuff
}}

但我希望它是这样的:

callbackfunction(response, param) {
    if (response=='loggedin'){
    // ... do stuff with param
}}

我的问题是,这样传递参数是否有效:

<script type='text/javascript'>
firstfunction(callbackfunction(param));
</script>

还是我做错了?

4

5 回答 5

30

在直接回答您的问题时,这不起作用:

 firstfunction(callbackfunction(param));

这将callbackfunction立即执行并将执行它的返回值作为参数传递给它,firstfunction这不太可能是你想要的。


从您的问题中不清楚您是否应该更改firstfunction()为在调用回调时传递两个参数,callbackfunction()或者您是否应该创建一个匿名函数来调用带有参数的回调函数。

这两个选项如下所示:

function firstfunction(callback) {
    // code here
    callback(arg1, arg2);
}

firstfunction(callbackfunction);

或者

function firstfunction(callback) {
    // code here
    callback();
}

firstfunction(function() {
    callbackfunction(xxx, yyy);
});
于 2012-10-22T01:57:31.380 回答
10

使用匿名函数:

function foo( callback ) {
  callback();
}

function baz( param ) {
  console.log( param );
}

foo( function(){ baz('param') });
于 2012-10-22T01:16:05.723 回答
2

调用函数时添加参数。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

xdaz 已经回答了简单的版本。这是一个带有可变数量参数的示例。

function someObject(){
        this.callbacks=new Array();
        this.addCallback=function(cb){
            this.callbacks[this.callbacks.length]=cb
        }
        this.callCallbacks=function(){
            //var arr=arguments; this does not seem to work
            //arr[arr.length]="param2";
            var arr = new Array();
            for(i in arguments){
                arr[i]=arguments[i];
            }
            arr[arr.length]="another param";
            i=0;
            for(i in this.callbacks){
                this.callbacks[i].apply(null,arr);
                //this.callbacks[i].apply(this,arr);
                //this is a ref to currrent object
            }
        }
        this.callCallbacksSimple=function(arg){
            for(i in this.callbacks){
                this.callbacks[i](arg,"simple parameter");
            }

        }
}
function callbackFunction(){
    for(i in arguments){
        console.log("Received argument: " + arguments[i]);
    }
}
var ObjectInstance=new someObject();
ObjectInstance.addCallback(callbackFunction);
ObjectInstance.callCallbacks("call callbacks");
ObjectInstance.callCallbacksSimple("call callbacks");
于 2012-10-22T02:17:32.083 回答
1

function是关键字,不能用作函数名。

假设您的函数名称是foo,那么您可以执行以下操作:

var param = 'what ever';
foo(function(response) {
  callbackfunction(response, param);
});
于 2012-10-22T01:15:55.647 回答
1

我想这就是你要找的。

假设您正在使用 jQuery ajax 做某事,并且您将其传递给命名回调。这里我们有一个 onError 回调,您可以使用它来记录或处理应用程序中的错误。它符合 jQuery Ajax 错误回调签名,除了您可能想在后面添加的额外参数

function onError(jqXHR, textStatus, errorThrown, yourOwnVariableThing) {
    console.error('Something went wrong with ' + yourOwnVariableThing);
}

这是您的函数将被调用的地方 - 但您需要一个额外的参数

$.ajax("/api/getSomeData/")
 .done(onDone)
 .fail(onError) 
 .always(onComplete);

所以这就是您可以添加额外参数的方法

$.ajax("/api/getSomeData/")
  .done(onDone)
  .fail(onError.bind(this, arguments[0], arguments[1], arguments[2], 'Moo Moo'); 
  .always(onComplete);

arguments是 JavaScript 中的一个数组,其中包含传递给函数的所有参数,因此您只需将这些参数传递给回调。

论据

绑定

于 2016-07-20T09:23:20.273 回答