2011-03-23 61 views
1

我得到了这个例子演示了Stoyan Stefanovs的AJAX 面向对象的JavaScript(第275页)。在这个例子中,他要求三个不同的文件。我有几个问题,如果你们任何人都可以提供帮助。JavaScript XMLHttprequests

  1. 什么是xhr.send('')在做什么?我们为什么需要它?我之前认为GET与服务器建立了联系,那么为什么要发送?
    (另一个问题涉及到关闭,我不`吨完全理解...)

  2. 究竟是越来越为paramater到function(myxhr)通过呢?

  3. 关于具有(xhr)作为参数传递的匿名函数,是否可以解释程序中xhr传递给匿名函数的哪个点?例如,xhr.open发生了吗?

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

  5. 是匿名函数的参数(xhr)作为参数myxhrfunction(myxhr)中通过一旦匿名函数被调用?

  6. 如果5是真的 - 那xhr传递为function(myxhr) - 为什么一个参数是有必要的参数名称从xhr改为myxhr

示例代码:

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

request (
    'http://www.phpied.com/files/jsoop/content.txt', 
    function (o){ 
    document.getElementById('text').innerHTML = o.responseText; 
    } 
); 

request(
    'http://www.phpied.com/files/jsoop/content.html', 
    function(o) { 
    document.getElementById('html').innerHTML = o.responseText; 
    } 
); 

request(
    'http://www.phpied.com/files/jsoop/content.xml', 
    function(o){ 
    document.getElementById('xml').innerHTML = 
    o.responseXML.getElementsByTagName('root')[0].firstChild.nodeValue; 
    } 
); 

回答

2

什么是xhr.send( '')在做什么?为什么我们 需要它?我以为GET在 之前就是建立了与 服务器的联系,那么为什么这个发送? (该 其他问题涉及到封闭 我`吨完全理解...)

打开刚刚建立的请求。发送实际上发送它。当您发出POST请求时,您需要通过发送。

什么确切地通过作为 参数功能(myxhr)?

变量的内容xhr

关于匿名函数, 已经(XHR)作为参数传递, 你能在 程序XHR什么点解释被传递到 匿名函数?例如,xhr.open发生后是否为 ?

只要函数被调用(立即定义后跟())。

为什么函数(myxhr)是必需的?如果 它是创建关闭,为什么在这里需要关闭 ?

不是。即使xhr变量本地不在request函数(它是),那么它可以通过this访问。

是匿名 函数的参数(XHR)函数(myxhr)作为参数 myxhr获得通过,一旦 匿名函数被调用?

是的。

如果5是真实的 - 这是XHR作为 参数传递给函数(myxhr) - 这是为什么 有必要参数 名字从XHR改为myxhr?

不是。您可以在不同的作用域重用变量名称。尽管如此,它并没有让人感到困惑。

+0

+1 from me。在此线程中没有人获得任何投票之前。 ;-) – Tomalak 2011-03-23 08:02:27

+0

非常感谢您的帮助。 – mjmitche 2011-03-23 10:04:11

1

一个有用的资源来理解这是来自MSDN XMLHHTPRequest ObjectUsing XMLHTTPReuqestobject,但为简洁起见,我尝试很快回答你的问题。

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

非常感谢你 – mjmitche 2011-03-23 10:05:27

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)function(myxhr)参数myxhr获得通过?

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

6 - 如果5为真 - xhr作为参数传递给函数(myxhr) - 为什么需要将参数名称从xhr更改为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在“内部”的功能,你必须使用比i别的东西作为内部函数的参数名称。

+0

非常感谢你的帮助。 – mjmitche 2011-03-23 10:03:43

相关问题