Область видимости переменной!
Привет!
Есть код: (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 "глобальной", чтобы она всегда содержала переданные параметры? |
написал чушь, стерто :)
|
я вставил алерт
??? все видно, как видно :) (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 не будет определена! |
а,да...
ну так пройтись по всему массиву и вызвать 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) }); |
Решил проблему следующим образом:
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) }? |
может, дело в контексте. но тут с рекурсией всё в порядке :)
пример похож на ваш. 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") ); |
Часовой пояс GMT +3, время: 22:14. |