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

Передавать аргументы в обратный вызов ajax onreadystatechange?

Что такое обычный чистый javascript (т.е. не JQuery) способ передать аргументы в анонимный обратный вызов onreadystatechange?

Например:

function doRequest(){
    /* Get an XMLHttpRequest in a platform independent way */    
    var xhttp = getXmlHttpRequestObject(); 

    var msg="show this message when done"; /* another variable to pass into callback */

     /* How do I pass 'msg' and 'xhttp' into this anonymous function as locals
       named 'x' and 'm'??? */
    xhttp.onreadychangestate=function(x,m)
    {
       if( x.readyState == 4 )
       {
           alert(m);
       }
    }
    /* do the open() and send() calls here.... */
}
4b9b3361

Ответ 1

Javascript поддерживает закрытие, поэтому анонимная функция, которую вы написали, сможет получить доступ к xhttp и msg из охватывающей области doRequest().

Если вы хотите сделать это явно (скажем, если вы хотите определить функцию обратного вызова где-то еще в коде и повторно использовать ее), вы можете создать функцию, которая создает обратные вызовы. Это также позволяет вам использовать псевдонимы для переменных с разными именами (например, x и m):

function createCallback(x, m) {
    return function() {
        /* Do whatever */
    };
}

а затем в doRequest(), do xhttp.onreadystatechange = createCallback(xhttp, msg);

Если бы все, что вы хотели сделать, это переименование переменных, вы можете сделать это inline и анонимно:

xhttp.onreadystatechange = (function(x, m) {
    return function() {
        /* Do stuff */
    }
})(xhttp, msg);

Ответ 2

Часть вышеупомянутого ответа не работала для меня. Во-первых, для отдельной функции callBack без параметров:

 xhttp.onreadystatechange = callBack;   //works; the function NAME is required

Теперь предположим, что функция callBack модифицирована для получения некоторых параметров:

 xhttp.onreadystatechange = callBack(x,m); //didn't work, and didn't know why
 xhttp.onreadystatechange = createCallback(xhttp,msg); //bad part of above Answer

Однако в другом месте здесь, в StackOverflow, кто-то объяснил, что это связано с необходимостью назначать "ссылку на функцию" вместо "вызова функции" на onreadystatechange (например, NAME выше является ссылкой на функцию) и отправляет решение

 xhttp.onreadystatechange = function(){callBack(x,m);}; //works

Я пришел сюда, чтобы добавить что-то к этому другому ответу, но теперь его не найти. Поэтому я мог бы добавить его здесь. В моем собственном коде я использовал как локальные переменные, так и глобальные переменные, и обнаружил то, что, похоже, не работает правильно, но теперь, когда я знаю, что на самом деле произошло, Word Of Warning кажется подходящим. Предположим, что "g" - глобальная переменная:

 xhttp.onreadystatechange = function(){callBack(x,g);};//anonymous function works

Ссылка на функцию назначается для onreadystatechange в некоторый момент времени (T0), а функция callBack вызывается в другое время (T1). Ну, значение глобальной переменной "g" в T1 - это значение, которое передается функции callBack, а не значение "g" , когда назначение функции было назначено на T0. Не позволяй этому укусить тебя, как будто это укусило меня! (Локальные переменные обычно не имеют этой проблемы, потому что они обычно не входят в область видимости в T1, поэтому JavaScript должен использовать свои существующие значения в T0 при настройке параметров-значений анонимной функции.)