 
			
				03.06.2012, 18:51
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2012 
					
					
					
						Сообщений: 56
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Коректность алгоритма
			 
			
		
		
		
		Всем доброго.  
Скажите пожалуйста насколько корректен выбранный мною алгоритм с точки зрения "замусоривания памяти"
 
Есть конструктор:
 
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 - параметры запроса
 
Не попадаю ли я таким методом на утечку памяти? 
Ведь я фактически создаю объекты но не освобождаю явно после отработки?
 
Правильно ли я поступаю или есть другой более лучший способ, который не заставит браузер оставлять мусор?  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 19:15
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Vit
			
		
	 | 
 
	
		Не попадаю ли я таким методом на утечку памяти? 
Ведь я фактически создаю объекты но не освобождаю явно после отработки?
	 | 
 
	
 
 в js есть сборщик мусора, так что опасаться не стоит. стоит только избегать замыканий, где они не нужны.
 
а вот этого лучше избегать, т.к. переменные не будут очищаться до того, как функция обработки завершения запроса не прекратит работу.
 
_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*/!*;
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось melky, 03.06.2012 в 19:18.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 19:17
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 что-то знаю 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.05.2009 
					
					
					
						Сообщений: 5,176
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	
		лучше сделать так: 
_ajax.onreadystatechange=function(){          if (this.readyState == 4){
	 | 
 
	
 
 в ИЕ это вызовет ошибку. Так как this там не будет равен xhr  
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 19:30
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от devote
			 
		
	 | 
 
	| 
		в ИЕ это вызовет ошибку. Так как this там не будет равен xhr
	 | 
 
	
 
 Вот, посмотрите
 http://jsfiddle.net/yPKkJ/
В IE10 в режиме эмуляции IE8,IE7 всё нормально.
 
Или Вы ActiveX компонент имели в виду?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 19:30
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 что-то знаю 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.05.2009 
					
					
					
						Сообщений: 5,176
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		melky, 
 хотя эта проблема наблюдается в ИЕ6 тогда да, можно поставить this. Я что-то старой инфой оперирую    
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 19:31
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 что-то знаю 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.05.2009 
					
					
					
						Сообщений: 5,176
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от melky
			
		
	 | 
 
	| 
		Вот, посмотрите
	 | 
 
	
 
 да я только что проверил в локалке.. ИЕ6 в попе, остальные норм.  
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 19:45
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2012 
					
					
					
						Сообщений: 56
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от devote
			 
		
	 | 
 
	| 
		 ИЕ6 в попе, остальные норм.
	 | 
 
	
 
 Ишачок меня мало интерсует в рамках конкретно этого проекта. 
По крайней мере устаревшие браузеры уж точно не интересуют.
 
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	| 
		 вынести обработчик куда-нибудь в долгую память.
	 | 
 
	
 
 А почему? 
И как правильно описать handler(), дабы он входил в состав объекта, и видел OnOk и OnFail?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 20:35
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Vit
			
		
	 | 
 
	| 
		А почему?
	 | 
 
	
 
 Потому что когда Вы каждый раз пишете  el.onclick = function(){ ..., Вы каждый раз  убиваете котёнка создаёте новую функцию. А делая, как я показал, Вы используете одну каждый раз.
 
	
 
	| 
		
			Сообщение от devote
			
		
	 | 
 
	| 
		да я только что проверил в локалке.. ИЕ6 в попе, остальные норм.
	 | 
 
	
 
 Я не пишу под него, как и под FF 3.6. Я в стаде   .
 
	
 
	| 
		
			Сообщение от Vit
			
		
	 | 
 
	| 
		И как правильно описать 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
        };
    }
})();
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось melky, 03.06.2012 в 20:39.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 21:03
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2012 
					
					
					
						Сообщений: 56
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Т.е. мне лучше описать handler как private метод объекта, и присваивать его onreadystatechange, дабы каждый раз не "создавать" анонимную функцию. 
При этом поскольку сам handler будет принадлежать объекту я смогу в нем вызывать мои OnOk и OnFail? 
Верно я понял? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				03.06.2012, 21:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Vit
			
		
	 | 
 
	| 
		Верно я понял?
	 | 
 
	
 
 Если взять объект, "которому принадлежит handler", за req, а "смогу вызывать onOk .." - за итог, то да, верно.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |