locHTTPRequest.onreadystatechange = ProcessPaymentHTTPRequest;
Создает ссылочный цикл между объектом native-JScript (функция ProcessPaymentHTTPRequest
, которая имеет объект запроса в области видимости) и объектом не-JScript (объект XMLHttpRequest
ActiveX).Именно этот вид ссылочного цикла приводит к сбою IE в GC.
delete locHTTPRequest["onreadystatechange"];
В то время как это будет нормально для нативного объекта JavaScript, в действительности delete
на самом деле не работает для удаления обработчика событий изобъект DOM.Таким образом, обработчик и цикл ссылок остаются на месте.Вместо этого обычно выполняется перезапись обработчика locHTTPRequest.onreadystatechange
значением dud, например предопределенной функцией, которая немедленно возвращает значение, либо ''
, либо null
.Или, в качестве альтернативы, используйте addEventListener
/ attachEvent
и соответствующие им методы обработчика удаления.
CollectGarbage();
Что это делает?На самом деле вы мало что можете сделать, чтобы повлиять на GC от JS.
Помимо:
<script language="JScript">
type="text/javascript"
вместо language
.Я знаю, что вас не волнует не-IE, но, кажется, мало смысла в том, чтобы быть безвозмездно несовместимым и нестандартным.
try { var locHTTPRequest = new ActiveXObject("MSXML2.XMLHTTP.6.0"); }
catch (e) { var locHTTPRequest = new ActiveXObject("MSXML2.XMLHTTP"); }
В этом нет необходимости.Вы не используете какие-либо функции более новой версии MSXML, так что просто используйте unversioned XMLHttp
.Кроме того, сначала перейдите на native-JS XMLHttpRequest
.Не только потому, что он существует в других браузерах, но и потому, что он более эффективен и, будучи родным JS, не вызывает утечек памяти.
Лучше: добавить запасной вариант для IE6:
if (!window.XMLHttpRequest && 'ActiveXObject' in window) {
window.XMLHttpRequest= function() {
return new ActiveXObject('MSXML2.XMLHttp');
}
}
а затем просто используйте стандартный new XMLHttpRequest()
везде.
locHTTPRequest.send(null);
Это нестандартно даже для IE.Опустите аргумент data, если вы не хотите ничего отправлять, вместо того, чтобы указывать null
.