Подтвердить что ты не робот

Функция обратного вызова Javascript с параметрами

Этот вопрос выглядит как дубликат, поскольку название почти реплицируется. Но мой вопрос кажется более простым, и я не могу найти ответ на него.

У меня есть функция 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>

или я делаю это неправильно?

4b9b3361

Ответ 1

В прямом ответе на ваш вопрос это не работает:

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

Ответ 2

Использовать анонимную функцию:

function foo( callback ) {
  callback();
}

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

foo( function(){ baz('param') });

Ответ 3

Добавление параметров при вызове функции. 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");

Ответ 4

function - ключевое слово, вы не можете использовать его как имя функции.

Скажем, ваше имя функции foo, тогда вы можете сделать следующее:

var param = 'what ever';
foo(function(response) {
  callbackfunction(response, param);
});

Ответ 5

Я думаю, что это то, что вы ищете.

Допустим, вы используете 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, содержащий все аргументы, переданные функции, и поэтому вы просто передаете эти аргументы вместе с обратным вызовом.

Arguments

Bind