| 
	| 
	
	| 
		
	| 
			
			 
			
				24.07.2011, 23:20
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 12.07.2011 
						Сообщений: 71
					 
		
 |  |  
	| 
				Область видимости переменной!
			 Привет! 
Есть код:
 
(function(){
	    var
		jsLoad = {
	load : function(src) {
		if(src.length !=0){ 
			script(src.shift(), arguments.callee);
}
	}
},
script = function(src, handler) {
// ... динамическое подключение файлов из массива!
};
// Вызываем.
jsLoad.load(				['test1.js','test2.js','http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js']
		);
})();
Проблема в том, что когда происходит вызов script(src.shift(), arguments.callee), подключается только первый файл test1.js, а потом появляется ошибка:
src is undefined if(src.length !=0){
 
При повторном запуске уже невозможно определить переменную src! 
Как можно сделать переменную src "глобальной", чтобы она всегда содержала переданные параметры? |  |  
	| 
		
	| 
			
			 
			
				25.07.2011, 22:42
			
			
			
		 |  
	| 
		
			
			| Кандидат Javascript-наук       |  | 
					Регистрация: 07.09.2010 
						Сообщений: 133
					 
		
 |  |  
	| написал чушь, стерто  			 Последний раз редактировалось TicTac, 25.07.2011 в 22:45.
 |  |  
	| 
		
	| 
			
			 
			
				25.07.2011, 23:15
			
			
			
		 |  
	| 
		
			
			| sinistral     |  | 
					Регистрация: 28.03.2011 
						Сообщений: 5,418
					 
		
 |  |  
	| я вставил алерт 
??? 
все видно, как видно    
(function(){
	    var
		jsLoad = {
	load : function(src) {
                *!*alert("Тип src -> \n"+ typeof src + "\n\n\nshift() ->\n"+src.shift());*/!*
		if(src.length !=0){ 
			//script(src.shift(), arguments.callee);
}
	}
},
script = function(src, handler) {
// ... динамическое подключение файлов из массива!
};
// Вызываем.
jsLoad.load(				['test1.js','test2.js','http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js']
		);
})();
 |  |  
	| 
		
	| 
			
			 
			
				26.07.2011, 22:53
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 12.07.2011 
						Сообщений: 71
					 
		
 |  |  
	| 
	
 
	| Сообщение от melky   |  
	| я вставил алерт 
 ???
 все видно, как видно
  
 
(function(){
	    var
		jsLoad = {
	load : function(src) {
                *!*alert("Тип src -> \n"+ typeof src + "\n\n\nshift() ->\n"+src.shift());*/!*
		if(src.length !=0){ 
			//script(src.shift(), arguments.callee);
}
	}
},
script = function(src, handler) {
// ... динамическое подключение файлов из массива!
};
// Вызываем.
jsLoad.load(				['test1.js','test2.js','http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js']
		);
})();
 |  
	
 Это понятно, что ее сейчас видно! 
А когда произойдет script(src.shift(), arguments.callee);  для последующей обработки массива, эту часть Вы кстати закомментировали, переменная src не будет определена! |  |  
	| 
		
	| 
			
			 
			
				26.07.2011, 23:42
			
			
			
		 |  
	| 
		
			
			| sinistral     |  | 
					Регистрация: 28.03.2011 
						Сообщений: 5,418
					 
		
 |  |  
	| а,да... 
ну так пройтись по всему массиву и вызвать script
 
load : function(src) {
                 for( var i = src.length,a=0;a<i;a++) 
                              script( src[a], function(){} );
}
или так, если уж важна рекурсия.
 
load : function(src) {
                 if(src.length !=0)
			   script(  src.shift()  , function(){ arguments.callee.call(window, src) });
}
 |  |  
	| 
		
	| 
			
			 
			
				27.07.2011, 06:52
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 12.07.2011 
						Сообщений: 71
					 
		
 |  |  
	| 
	
 
	| Сообщение от melky   |  
	| а,да... 
 ну так пройтись по всему массиву и вызвать script
 
 
 
load : function(src) {
                 for( var i = src.length,a=0;a<i;a++) 
                              script( src[a], function(){} );
}
 или так, если уж важна рекурсия.
 
 
 
load : function(src) {
                 if(src.length !=0)
			   script(  src.shift()  , function(){ arguments.callee.call(window, src) });
}
 |  
	
 Интересный вариант, но:
too much recursion script(src.shift(), function(){ arguments.callee.call(window, src) });
 |  |  
	| 
		
	| 
			
			 
			
				27.07.2011, 13:21
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 12.07.2011 
						Сообщений: 71
					 
		
 |  |  
	| Решил проблему следующим образом: 
jsLoad = {
	load : function(src) {
				script(src.shift(), function(){alert(src.length)
											if(src.length !=0){
												script(src.shift(), arguments.callee)
											}
										});
	}
};
Спасибо большое за советы! Помогло! 
Все же хотелось бы узнать, почему не работало сfunction(){ arguments.callee.call(window, src) } ? |  |  
	| 
		
	| 
			
			 
			
				27.07.2011, 13:37
			
			
			
		 |  
	| 
		
			
			| sinistral     |  | 
					Регистрация: 28.03.2011 
						Сообщений: 5,418
					 
		
 |  |  
	| может, дело в контексте. но тут с рекурсией всё в порядке   
пример похож на ваш.
 
var result = [];
      function b(a, c){ 
           /*что-то делаем*/
           result.push(a);
           c();// callback
        }
       function rec(a) {
            if( a.length != 0 ) { 
                 b(    a.shift(), function(){ rec(a) }   );
            } else {
                   return result;
            }
       }
rec( [ "a","b","c" ] );
alert( result.join("\n") );
 |  |  |  |