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") );
|
|
|
|