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
в function(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
Однако, если вы хотите использовать "external" i
во "внутренней" функции, вам придется использовать что-то другое, чем i
, в качестве имени параметра для внутренней функции.