Проверка повторного вызова функции без глобальных переменных
Здравствуйте!
Подскажите, пожалуйста, можно ли проверить, была ли вызвана функция, без использования глобальных переменных? Написал функцию на чистом JS, привязанную к кнопке и отвечающую за анимацию. var animate = function(animationVar) { animationVar = animationVar || 0; if (animationVar > CONST) return; window.setTimeout(function () { animate(animationVar + 1); }, 50); } Соответсвенно, если нажать два раза анимация ускоряется. Можно ли как-то сделать проверку, была ли уже вызвана функция? Можно поставить глобальную переменную и проверять ее внутри функции, но хотелось бы сделать изящнее. Смотрел в сторону замыканий, но так ничего и не смог придумать, чтобы работало, как надо. Спасибо. |
Цитата:
function test(){ alert('Вызывалась '+(arguments.callee.count++)); }; test.count=0; test(); test(); test(); |
Спасибо большое! Это должно помочь. Единственная проблема, что в моем примере происходит рекурсивный вызов. Как проверить, была ли функция вызвана изнутри или снаружи, если вызов проиходит по одинаковому имени?
|
GlaIZier,
arguments.callee устаревшее свойсвтво которое скоро удалят, для того чтобы обратиться к самой функции, изнутри её самой, надо использовать её имя: function test(){ alert('Вызывалась '+(test.count++)); }; test.count=0; test(); test(); test(); ksa не очень разбирается в стандартах по этому дал тебе вредный совет. Так же не стоит бояться что это название перекроется, имя функции попадает в замыкание функции если используется внутри, подобно аргументам) так что бояться не стоит. q = function cat(){ alert(cat) } cat = 11; q() // выведет не 11 |
Цитата:
function test(){ arguments.callee.out++; alert('Вызывалась '+(arguments.callee.out-arguments.callee.in)+' внешне и '+arguments.callee.in+' внутренне'); if (arguments.callee.out==2) { test.in++; test(); }; }; test.in=0; test.out=0; test(); test(); test(); |
Цитата:
|
Цитата:
|
Не слушай ksa, он дает вредные советы. Передавай динамические данные вглубь рекурсии, тогда ты будешь знать уровень на котором находится рекурсия, например если мы на нуливом уровне, значит функция вызванна извне.
function rec(deep) { if(!deep) deep = 0; // по умолчанию глубина 0 if (deep > 5) { alert('глубина рекурсии больше 5, дальше не пойдем, всплываем'); return; // всплываем } alert('глубина рекурсии: ' + deep); // погружаемся // когда идем вглубь, прибавляем индекс глубины на 1 rec(deep + 1); // всплываем alert('всплываем, и мы на уровне: ' + deep); } rec() |
Цитата:
|
ksa, Так говоришь как будто я не лучше тебя программирую.
|
Часовой пояс GMT +3, время: 17:07. |