为什么我们在XMLHttpRequest中编写send()之前编写onload()函数

use*_*946 3 javascript xmlhttprequest

我是XMLHttpRequest的新手.我不明白为什么我们在send()函数之前编写onload()函数.onload()函数处理我们收到的响应和send()函数向服务器发送请求.所以onload()必须按照我的理解在send()函数之后编写.有人可以帮助理解这一点.

var xmlhttp = new XMLHttpRequest(),
  method = 'GET',
  url = 'https://developer.mozilla.org/';

xmlhttp.open(method, url, true);
xmlhttp.onload = function () {
  // Do something with the retrieved data
};
xmlhttp.send();
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

我不明白为什么我们在onload()功能之前写send()函数.

因此,在发送请求之前,负载处理程序就位,因为发送请求将导致调用处理程序(如果成功).

onload()函数处理响应我们收到的send()函数和函数向服务器发送请求.所以onload()必须send()按照我的理解在功能之后编写.

send叫(由XHR基础设施)(或潜在的期间).分配给它时onload,你不是在调用它.你只是定义它,以便当XHR需要调用它时它就在那里.

这是发生的事情:

  1. 您创建XHR.
  2. 您为其load事件注册了一个处理程序(在您的情况下,通过分配函数onload).
  3. 你打电话send.
    1. 浏览器启动(并可能完成)请求
  4. 请求完成后,如果成功,浏览器的XHR处理将触发该load事件.这会查找当前已注册的处理程序,load并将调用队列调度到这些处理程序(如果有).只要主JavaScript线程可用于运行它们,就会运行这些调用.

很多时候,你会以错误的方式做到这一点,因为在请求完成的时候,你会把load处理程序放在那里; 但并非总是如此.load是一个事件.如果可以立即满足请求(例如,从缓存中),浏览器可以load在期间触发send,并查看调用期间是否存在任何load处理程序,如果没有,则不会对任何回调进行排队调用.稍后当您附加处理程序时,事件已被触发(当没有附加时).send

所以你必须在调用之前附加处理程序send.