Коректность алгоритма
Всем доброго.
Скажите пожалуйста насколько корректен выбранный мною алгоритм с точки зрения "замусоривания памяти" Есть конструктор: 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:10. |