Javascript, функция внутри функции проблема - PullRequest
1 голос
/ 18 февраля 2011

Эй, я работал с проектом javascript и столкнулся с проблемой, которую просто не понимаю.Вот код, который я не использую в своем проекте, но это упрощенная версия.

var x;

function FetchBox() {alert("Worked");}

function A(m,n) { 
    x = new XMLHttpRequest(); 
    x.open("GET", m, true);
    x.onreadystatechange=function(){
        n(); 
        x.send();
    };
}

A("http://jsfiddle/echo/xml/", FetchBox);

Я могу легко изменить функцию, чтобы она заработала:

function A(m,n) { 
    x = new XMLHttpRequest(); 
    x.open("GET", m, true);
    x.onreadystatechange=n();x.send();
}

Но в моей более сложной версии я хочу добавить функцию readyState и некоторые другие вещи.

function A(m,n) { 
    x = new XMLHttpRequest(); 
    x.open("GET", m, true);
    x.onreadystatechange=
        if(x.readyState===4){
            n(); 
            x.send();
        };
}

Почему я не могу включить функцию внутри этой функции?JsFiddle link: http://jsfiddle.net/M6Upv/17/

Хороших выходных, Ульрик

Ответы [ 5 ]

5 голосов
/ 18 февраля 2011

Попробуйте так.

function A(m,n) { 
    x = new XMLHttpRequest(); 
    x.open("GET", m, true);
    x.onreadystatechange = function() {
        if(x.readyState===4) {
            n(); 
            //x.send(); //look below
        };
    }
    x.send() //I think, it should be here
}
1 голос
/ 18 февраля 2011

Вам необходимо переместить send() в вне обработчика событий onreadystatechange:

function A(m,n) { 
    x = new XMLHttpRequest(); 
    x.open("GET", m, true);
    x.onreadystatechange = function() {
        if(x.readyState === 4) {
            n(); 
        };
    }
    x.send();
}
1 голос
/ 18 февраля 2011

Вам нужно запустить x.send(), прежде чем можно будет вызвать x.onreadystatechange().

function A(m, n) {
    x = new XMLHttpRequest();
    x.open("GET", m, true);
    x.onreadystatechange = function() {
        if (x.readyState == 4) {
            n();
        }
    };
    x.send();
}
1 голос
/ 18 февраля 2011

Не совсем понятно, что вы пытаетесь сделать, но вот некоторые вещи, которые вы делаете неправильно:

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

В последнем примере вы пытаетесь присвоить ему оператор if, который вообще не имеет смысла.

В предыдущих версиях вы вызывали send() внутри него - что не имеет смысла, так как запуск не начнется, пока не будет вызван send().

Во всех версиях вы определяете x как глобальный, который является хорошим способом вызвать условия гонки.

1 голос
/ 18 февраля 2011

То, что вы делаете, когда вы меняете его, просто вызывает n(), присваивает его возвращаемое значение x.onreadystatechange и затем вызывает x.send().Заключение вашего кода в function() { .. } задерживает вычисление до того момента, когда обратный вызов фактически сработает.Вам все еще нужно обернуть свой код в function() { .. }, чтобы это работало.

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