Состояние привязки глобальной переменной Javascript внутри функции - PullRequest
2 голосов
/ 14 июля 2011

Я выполняю вызов AJAX (с помощью dojo), и я хотел знать, как лучше всего передать вызывающий объект в функцию обратного вызова

var that = this;
dojo.xhrGet({
    url : 'script.php',
    handleAs : "javascript",
    load : function(response){
        /*The callback on success*/
        console.log('Ajax Completed Successfully for: ' + that.name);
    }
});

У меня вопрос: loadсоздается во время компиляции или оценивается во время выполнения.В основном, если значение that изменяется между моментом создания var that = this и его вызовом после того, как AJAX вернет и вызовет load, будет ли это изменение отражено в load?Если так, то каков наилучший способ обеспечения того, чтобы сигнал возврата AJAX вызывал правильный объект?Нужно ли создавать конкретную функцию загрузки для каждого объекта?

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Вы можете заключить свою нагрузку в closure:

(function(that){
    dojo.xhrGet({
        url : 'script.php',
        handleAs : "javascript",
        load : function(response){
            /*The callback on success*/
            console.log('Ajax Completed Successfully for: ' + that.name);
        }
    });
})(this);

. Часть (function(x){ })(x); - это функция, выполняемая самостоятельно, которая дает значение x или this в качестве аргумента длясамоисполняющаяся функция.Значение x или that остается таким, каким оно должно быть.

1 голос
/ 14 июля 2011

В зависимости от того, что вы хотите сделать, вы можете вообще не создавать с load:, используя deferreds:

function get_data(){
    return dojo.xhrGet({
        url : 'script.php',
        handleAs : "javascript",
    });
}

function other_function(){
    var that = this;
    get_data().then(function(response){
        console.log("Ajax completed for" + that.name);
    });
}

(я не помню, работает ли это и при сбое ajax - нужно проверить этот бит)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...