JavaScript XMLHttprequests

时间:2011-03-23 06:49:12

标签: javascript ajax xmlhttprequest

我在第275页的Stoyan Stefanovs 面向对象的JavaScript 中演示了这个例子。在这个例子中,他正在请求三个不同的文件。如果有人能提供帮助,我会有几个问题。

  1. xhr.send('')在做什么?我们为什么需要它?我认为GET在线之前是与服务器建立联系,所以为什么要发送? (其他问题与我完全不了解的封闭有关......)

  2. 作为function(myxhr)的参数确切传递给了什么?

  3. 关于匿名函数,它有(xhr)作为参数传递,你可以解释程序xhr中的哪一点传递给匿名函数?例如,它是在xhr.open发生之后吗?

  4. 为什么函数(myxhr)是必要的?如果要创建闭包,为什么需要关闭呢?

  5. 是匿名函数的参数(xhr),一旦调用了匿名函数,就会在myxhr中作为参数function(myxhr)传递?

  6. 如果5为真 - xhr作为参数传递给function(myxhr) - 为什么需要将参数名称从xhr更改为{{1} }}

  7. 示例代码:

    myxhr

3 个答案:

答案 0 :(得分:2)

  

xhr.send('')在做什么?为什么我们   需要它?我认为GET在线   之前是建立联系   服务器,为什么这个发送? (该   其他问题与关闭有关   我完全不了解......)

打开只是设置请求。发送实际发送它。当您发出POST请求时,您需要传递发送。

  

究竟是什么传递作为一个   功能参数(myxhr)?

变量xhr的内容。

  

关于匿名功能,   其中(xhr)作为参数传递,   你能解释一下这个问题吗?   程序xhr传递给   匿名功能?例如,是吗?   xhr.open发生之后?

调用函数后(()后面的定义会立即执行)。

  

为什么函数(myxhr)是必要的?如果   它是为了创造封闭,为什么要关闭   这里有必要吗?

不是。即使xhr变量没有本地作用于request函数(它是),也可以通过this访问它。

  

是匿名的参数(xhr)   函数作为参数传递   myxhr in function(myxhr)一次   匿名函数被调用?

是。

  

如果5为真 - 那个xhr作为a传递   功能参数(myxhr) - 为什么   有必要改变参数   从xhr到myxhr的名称?

不是。您可以在不同的范围重用变量名称。它让它不那么令人困惑。

答案 1 :(得分:1)

了解这一点的有用资源是来自MSDN和XMLHHTPRequest ObjectUsing XMLHTTPReuqestobject,但为了简洁起见,我会尽快回答您的问题。

  1. xhr.send();通过Open方法向URL发出请求。
  2. XMLHTTPRequest对象作为函数参数function(myxhr)
  3. 传递
  4. 'xhr'在接收到某些响应后更改请求的状态时传递给函数。
  5. 'myxhr'只是您可以根据需要更改的参数名称,但传递的对象是XMLHttpResponse类型。
  6. 根本没必要。

答案 2 :(得分:1)

  

1 - xhr.send('')在做什么?

它将请求发送到服务器。在调用send()之前没有发生网络活动。

  

1.a - 我们为什么需要它?我之前认为GET是在与服务器建立联系之前,为什么要发送?

因为open()无法与服务器通信。它只是准备请求对象。

  

2 - 作为function(myxhr)的参数传递到底是什么?

将对象xhr传递给该函数。

(function(myxhr){ /* ... */ })(xhr);
//-----------------------------^^^
//  define the function...    | ...and call it immediately
  

3 - 关于匿名函数,它有(xhr)作为参数传递,你能解释程序xhr中的哪一点传递给匿名函数?例如,它是在xhr.open发生之后吗?

立即通过。 function(myxhr)在生活中没有其他目的,而不是构造和返回它的结果(恰好是另一个函数),所以它的整个生命周期是单个语句,在其中定义和立即调用它。

  

4 - 为什么函数(myxhr)是必要的?如果要创建闭包,为什么需要关闭呢?

事实上,额外的封闭是没有必要的。这是多余的。这是等价的(它也会创建一个闭包):

function request(url, callback){
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = (function() {
      callback(xhr);
  });
  xhr.open('GET', url, true);
  xhr.send('');
}

闭包是必要的,因此注册到readystatechange事件的回调函数有一些上下文可以运行。只要定义了函数,就会自动创建闭包。它保留了定义函数时范围内的变量:上面保留了内部函数中xhrcallback(以及url!)的含义,甚至虽然何时将要执行回调函数,但尚不清楚。

  

5 - 一旦匿名函数被调用,匿名函数的参数(xhr)作为myxhr中的参数传递?

是的,它在调用匿名“外部”函数时传递(参见3)。

  

6 - 如果5为真 - 将xhr作为参数传递给函数(myxhr) - 为什么需要将参数名称从xhr更改为myxhr?

没有必要,但比在任何地方使用相同的变量名称更容易混淆。比较:

function(myxhr)

但是,如果要在“内部”函数中使用“外部”var f = (function(i) { /* outer scope i = 4 */ return (function(i) { /* inner scope i = 8 */ return i; })(i + 4); })(4); // now f is 8 ,则必须使用除i之外的其他内容作为内部函数的参数名称。< / p>