为什么函数open()和send()在下面的代码中的匿名函数()之后被调用

时间:2016-08-04 11:01:33

标签: javascript ajax

function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
     document.getElementById("demo").innerHTML = xhttp.responseText;
    }
  };
  xhttp.open("GET", "ajax_info.txt", true);
  xhttp.send();
}

根据我的理解,应首先在服务器上发出文件请求并发送给它。一旦服务器准备好处理请求,就应该执行匿名函数。我无法理解执行的流程。 我也很困惑何时在函数true的参数中使用falseopen()

3 个答案:

答案 0 :(得分:1)

onreadystatechange是一个事件处理程序。事件发生时调用该函数。这很像:

document.body.onclick = function () { ... };

赋值只是将属性赋给属性,它不会立即调用它。最后需要()(或使用apply或类似的东西)。

  

我也很困惑何时在函数open()的参数中使用true或false。

将其设置为false已弃用,因此请勿执行此操作。 true是默认设置,因此您可以完全省略它。

答案 1 :(得分:0)

让我们从xhttp.open("GET", "ajax_info.txt", true)开始 open方法需要3个参数

  1. 请求类型:通常是 GET POST
  2. 网址:要调用的网址
  3. async:true(异步)或false
  4. 设置为false已被弃用,因此您可以省略第3个参数,因为它默认为

    xhttp.send()发起请求

    xhttp.onreadystatechange是一个事件处理程序,不会立即触发,但会在状态发生变化时触发。

答案 2 :(得分:-1)

只是为了澄清此事:

当状态更改请求时,function ()称为onreadystatechange(顺便说一下:function()是一个匿名函数,作为<{1}} eventListener的

当XMLHttpRequest对象的状态发生更改时,分配给onreadystatechange eventListener的函数称为 everytime

所以你应该知道这个函数被多次调用
您可以使用onreadystatechange语句进行检查,如此

if

防止不必要的多次执行 (检查其他xhttp.onreadystatechange = function () { // when using on a local - file if (xhttp.readyState === 4) { // ...do something } } 可用于加载屏幕等等)

传递给readyState函数的truefalse参数表示调用是否应该是异步的。意思是如果它应该等到,服务器返回响应。如果脚本等待,则整个页面将冻结,直到呼叫结束。

以下是可能参数MDN Documentation open的列表:

open

如果您不安全,我建议您阅读文档,功能,对象等。

这里有一些很好的链接到这个特定主题(XMLHttpRequest):
MDN XMLHttpRequest

这里是&#34;流&#34;

的小型可视化
void open(
   DOMString method,           // GET, POST, ...
   DOMString url,              // URL
   optional boolean async,     // if true script continuse executing
   optional DOMString user,    // Username if needed 
   optional DOMString password // password if needed
);