javascript回调函数,onreadystatechange,在一个简单的ajax示例中

时间:2014-07-06 19:06:18

标签: javascript ajax

我在ajax中做这个教程,我不理解调用函数的一行。 (代码中的第6行)

// this is called from an onload event in the html body  tag
function process() {
    if (xmlHttp) {
        try {
            xmlHttp.open("GET", "hello.txt", true);
            xmlHttp.onreadystatechange = handleServerResponse; ***** THIS LINE HERE
            xmlHttp.send(null);
        } catch(e) {
            alert(e.toString());
        }
    };
}

handleServerResponse = function() {
    theD = document.getElementById('theD');

    if (xmlHttp.readyState == 1) {
        theD.innerHTML += "Status 1: server connectino established <br />";
    } else if (xmlHttp.readyState == 2) {
        theD.innerHTML += "Status 2: request recieved <br />";
    } else if (xmlHttp.readyState == 3) {
        theD.innerHTML += "Status 3: server processing task <br />";
    } else if (xmlHttp.readyState == 4) {
        if (xmlHttp.status == 200) {
            try {
                text = xmlHttp.responseText;
                theD.innerHTML += 'status 4: request completed, response delievered.';
                theD.innerHTML += '<br />' + text;
            } catch(e) {
            }
        } else {
            alert("request cannont be completed by server (status 4)");
        };
    };
}

为什么我不用括号称它?喜欢:xmlHttp.onreadystatechange = handleServerResponse();

当我这样做时,似乎只调用该函数一次,因为它只打印出状态2.但没有括号,但当函数被声明为变量时,似乎每次状态改变时都会调用它。这是为什么?

另外,为什么xmlHttp.onreadystatechange属性执行多次? body标签只能加载一次,因此只调用一次函数。为什么会循环?

我肯定错过了一些东西,无论是与ajax相关的对象还是javascript函数调用。

除了下面的答案,这里是对过程函数中“true”和“null”参数的一个很好的解释:http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

2 个答案:

答案 0 :(得分:1)

  

为什么我不用括号称它?喜欢:   xmlHttp.onreadystatechange = handleServerResponse();

因为在这一行上你并没有打电话给这个功能。您只是订阅一个事件(一个回调),稍后将由xmlHttp实例调用,并且当AJAX请求从服务器获得一些响应时。

当您致电xmlHttp.send(null);时,AJAX请求将被发送到服务器进行处理。此函数立即返回,并执行下一行代码。稍后,当服务器完成执行请求后,它将返回一些状态代码以及响应正文。正是在那一刻,实际的handleServerResponse函数才会被执行。

答案 1 :(得分:0)

handleServerResponse实际上是对函数本身的引用。添加括号实际上会调用该函数并将结果存储在xmlHttp.onreadystatechange中。在这种情况下,我们想让xmlHttp知道readyState更改后它必须做什么(我们称之为回调)。