Коректность алгоритма
Всем доброго.
Скажите пожалуйста насколько корректен выбранный мною алгоритм с точки зрения "замусоривания памяти" Есть конструктор:
function go(){
return{
Send:function (param,OnOk,OnFail){
var _ajax=ajax();
if(!_ajax){alert("Браузер не поддерживает AJAX"); return;}
_ajax.open("GET",serv+'?'+param,true);
_ajax.onreadystatechange=function(){
if (_ajax.readyState == 4){
if(_ajax.status==200){
var a=_ajax.responseText.substring(0,6);
if(a!='Error-') OnOk(_ajax.responseText)
else OnFail(_ajax.responseText);
};
if (_ajax.status!=200){OnFail("Неудачная попытка связи.");}
}
};
_ajax.send(null);
}
}
}
Где ajax() - функа создаюшая объект XMLHttpRequest. Вызов производится так:
var t=go();
t.Send(p,function(s){alert("Удачно "+s);},function(s){alert("Не удачно "+s);});
p - параметры запроса Не попадаю ли я таким методом на утечку памяти? Ведь я фактически создаю объекты но не освобождаю явно после отработки? Правильно ли я поступаю или есть другой более лучший способ, который не заставит браузер оставлять мусор? |
Цитата:
а вот этого лучше избегать, т.к. переменные не будут очищаться до того, как функция обработки завершения запроса не прекратит работу.
_ajax.onreadystatechange=function(){
if (_ajax.readyState == 4){
лучше сделать так - в this будет XMLHttpRequest, для которого в текущий момент обрабатывается событие. всё так же, как и в элементах.
_ajax.onreadystatechange=function(){
if (*!*this*/!*.readyState == 4){
а лучше - даже так - вынести обработчик куда-нибудь в долгую память.
function handler(){
if (this.readyState == 4){
//......
}
// function go ....
_ajax.onreadystatechange = *!*handler*/!*;
|
Цитата:
|
Цитата:
http://jsfiddle.net/yPKkJ/ В IE10 в режиме эмуляции IE8,IE7 всё нормально. Или Вы ActiveX компонент имели в виду? |
melky,
хотя эта проблема наблюдается в ИЕ6 тогда да, можно поставить this. Я что-то старой инфой оперирую :) |
Цитата:
|
Цитата:
По крайней мере устаревшие браузеры уж точно не интересуют. Цитата:
И как правильно описать handler(), дабы он входил в состав объекта, и видел OnOk и OnFail? |
Цитата:
Цитата:
Цитата:
http://jsfiddle.net/yPKkJ/2/ Боялся, что IE не понравится custom свойство id ... но, вроде, пережевал.
(function() {
var running = {};
function noop() {}
function handler() {
if (this.readyState === 4) {
(running[this.id][this.status === 200 ? "onsuccess" : "onerror"] || noop).call(this);
delete running[this.id]; // убиваем сами обработчиков. не нужны уже.
}
}
window.send = function(url, method, data, onsuccess, onerror) {
var req = new XMLHttpRequest();
req.open(method, url, true);
req.onreadystatechange = handler;
req.send(data);
req.id = (Math.random() * 1e5 | 0).toString(32); // случайна последовательность англ. букв и цифр.
running[req.id] = { // сохраняем, пока не понадобятся
"onsuccess": onsuccess,
"onerror": onerror
};
}
})();
|
Т.е. мне лучше описать handler как private метод объекта, и присваивать его onreadystatechange, дабы каждый раз не "создавать" анонимную функцию.
При этом поскольку сам handler будет принадлежать объекту я смогу в нем вызывать мои OnOk и OnFail? Верно я понял? |
Цитата:
|
| Часовой пояс GMT +3, время: 12:00. |