Функция проверки onDomReady. Не могу разобраться с кодом
Здравствуйте.
Читаю книгу по JS. В книге есть пример написания метода проверки загружена дом модель или нет. var $ = function() {}; $.prototype.onDomReady = function(callback){ if (document.addEventListener) { document.addEventListener("DOMContentLoaded", callback, false); } else { if(document.body && document.body.lastChild){ callback(); } else { return setTimeout(arguments.callee, 0); } } } $ = new $(); $.onDomReady(function() { alert("The DOM is ready!"); }); Слегка изменил код функции $.prototype.onDomReady: $.prototype.onDomReady = function ( callback ) { if ( document.body && document.body.lastChild ) { callback(); } else { alert ( "settimeout" ); return setTimeout ( arguments.callee, 100 ); } } Открывая страницу в FireFox, после одного или более alert "settimeout", FireBug выдает ошибку, что callback не является функцией, IE так же выдает ошибку, что необходим объект. Не понимаю, почему в таймер не передается аргумент в виде ссылки на функцию callback? |
Цитата:
http://alljs.ru/articles/timeout/patterns.html |
arguments.callee allows anonymous functions to refer to themselves, which is necessary for recursive anonymous functions... (https://developer.mozilla.org/en/Jav...guments/callee)
За ссылку спасибо, но мне бы хотелось узнать почему именно не работает исправленный мною код? Если в firefox я в блоке if ( document.body && ... ) пишу alert ( callback ); то у меня выдаются числа. Совсем не могу понять, что за число, и откуда оно берется. |
Цитата:
Цитата:
Цитата:
Последний абзац. |
Спасибо, за ссылку. Но если я подставляю:
setTimeout ( function () { arguments.callee( callback ); }, 100); То у меня возникает ошибка stack overflow. В итоге, если я ставлю тайм-аут с помощью arguments.callee, то передается функция вызвавшая себя, без параметра, а если вызываю с параметром, то у меня выдается stack overflow. |
Цитата:
Опишите внутри onDomReady безымянную функцию без параметров, её и вызывайте в таймауте. http://alljs.ru/articles/timeout/set...l.html#pattern |
В очередной раз, спасибо за ссылку.
Можно сделать через pattern: http://alljs.ru/articles/timeout/set...l.html#pattern А можно присвоить значение arguments.callee переменной: var self = arguments.callee, а потом в тайм-ауте вызвать с аргументом callback. setTimeout ( function () { self ( callback ); }, 500 ); Все должно работать. |
Часовой пояс GMT +3, время: 21:49. |