我在第275页的Stoyan Stefanovs 面向对象的JavaScript 中演示了这个例子。在这个例子中,他正在请求三个不同的文件。如果有人能提供帮助,我会有几个问题。
xhr.send('')
在做什么?我们为什么需要它?我认为GET在线之前是与服务器建立联系,所以为什么要发送?
(其他问题与我完全不了解的封闭有关......)
作为function(myxhr)
的参数确切传递给了什么?
关于匿名函数,它有(xhr)作为参数传递,你可以解释程序xhr中的哪一点传递给匿名函数?例如,它是在xhr.open
发生之后吗?
为什么函数(myxhr)是必要的?如果要创建闭包,为什么需要关闭呢?
是匿名函数的参数(xhr)
,一旦调用了匿名函数,就会在myxhr
中作为参数function(myxhr)
传递?
如果5为真 - xhr
作为参数传递给function(myxhr)
- 为什么需要将参数名称从xhr
更改为{{1} }}
示例代码:
myxhr
答案 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 Object的Using XMLHTTPReuqestobject,但为了简洁起见,我会尽快回答您的问题。
function(myxhr)
答案 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
事件的回调函数有一些上下文可以运行。只要定义了函数,就会自动创建闭包。它保留了定义函数时范围内的变量:上面保留了内部函数中xhr
和callback
(以及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>