Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.07.2011, 23:20
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 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 "глобальной", чтобы она всегда содержала переданные параметры?
Ответить с цитированием
  #2 (permalink)  
Старый 25.07.2011, 22:42
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

написал чушь, стерто

Последний раз редактировалось TicTac, 25.07.2011 в 22:45.
Ответить с цитированием
  #3 (permalink)  
Старый 25.07.2011, 23:15
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 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']
		);
})();
Ответить с цитированием
  #4 (permalink)  
Старый 26.07.2011, 22:53
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 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 не будет определена!
Ответить с цитированием
  #5 (permalink)  
Старый 26.07.2011, 23:42
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 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) });
}
Ответить с цитированием
  #6 (permalink)  
Старый 27.07.2011, 06:52
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 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) });
Ответить с цитированием
  #7 (permalink)  
Старый 27.07.2011, 13:21
Аспирант
Отправить личное сообщение для Kotakota Посмотреть профиль Найти все сообщения от Kotakota
 
Регистрация: 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) }?
Ответить с цитированием
  #8 (permalink)  
Старый 27.07.2011, 13:37
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 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") );
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
область видимости Ultimatum Общие вопросы Javascript 2 19.06.2011 10:47
Область доступа переменной IE7 ART-DELI jQuery 0 23.05.2011 15:29
Непонятки с областью видимости переменной zeleniy Общие вопросы Javascript 7 18.04.2011 16:08
Область видимости переменной. noumo Events/DOM/Window 3 03.12.2009 23:48
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 07:11