Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.03.2014, 12:45
Новичок на форуме
Отправить личное сообщение для GlaIZier Посмотреть профиль Найти все сообщения от GlaIZier
 
Регистрация: 14.03.2014
Сообщений: 8

Проверка повторного вызова функции без глобальных переменных
Здравствуйте!

Подскажите, пожалуйста, можно ли проверить, была ли вызвана функция, без использования глобальных переменных?

Написал функцию на чистом JS, привязанную к кнопке и отвечающую за анимацию.
var animate = function(animationVar) {
   animationVar = animationVar || 0;
   if (animationVar > CONST) return;
   window.setTimeout(function () {
      animate(animationVar + 1);
   }, 50);
}

Соответсвенно, если нажать два раза анимация ускоряется. Можно ли как-то сделать проверку, была ли уже вызвана функция?
Можно поставить глобальную переменную и проверять ее внутри функции, но хотелось бы сделать изящнее. Смотрел в сторону замыканий, но так ничего и не смог придумать, чтобы работало, как надо.

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 27.03.2014, 12:58
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,345

Сообщение от GlaIZier
можно ли проверить, была ли вызвана функция, без использования глобальных переменных?
Как вариант...

function test(){
	alert('Вызывалась '+(arguments.callee.count++));
};
test.count=0;
test();
test();
test();
Ответить с цитированием
  #3 (permalink)  
Старый 27.03.2014, 14:32
Новичок на форуме
Отправить личное сообщение для GlaIZier Посмотреть профиль Найти все сообщения от GlaIZier
 
Регистрация: 14.03.2014
Сообщений: 8

Спасибо большое! Это должно помочь. Единственная проблема, что в моем примере происходит рекурсивный вызов. Как проверить, была ли функция вызвана изнутри или снаружи, если вызов проиходит по одинаковому имени?
Ответить с цитированием
  #4 (permalink)  
Старый 27.03.2014, 18:47
GOD GOD вне форума
Аспирант
Посмотреть профиль Найти все сообщения от GOD
 
Регистрация: 27.03.2014
Сообщений: 54

GlaIZier,

arguments.callee устаревшее свойсвтво которое скоро удалят, для того чтобы обратиться к самой функции, изнутри её самой, надо использовать её имя:

function test(){
	alert('Вызывалась '+(test.count++));
};
test.count=0;
test();
test();
test();



ksa не очень разбирается в стандартах по этому дал тебе вредный совет. Так же не стоит бояться что это название перекроется, имя функции попадает в замыкание функции если используется внутри, подобно аргументам) так что бояться не стоит.


q = function cat(){
    alert(cat)
}

cat = 11;
q() // выведет не 11

Последний раз редактировалось GOD, 27.03.2014 в 18:51.
Ответить с цитированием
  #5 (permalink)  
Старый 27.03.2014, 18:48
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,345

Сообщение от GlaIZier
Как проверить, была ли функция вызвана изнутри или снаружи
Сделай два свойства input и output...

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();
Ответить с цитированием
  #6 (permalink)  
Старый 27.03.2014, 18:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,345

Сообщение от GOD
не очерь разбирается в стандартах по этому дал тебе вредный совет
Хорошо, что у нас есть ты...
Ответить с цитированием
  #7 (permalink)  
Старый 27.03.2014, 18:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,345

Сообщение от GOD
так что бояться не стоит
Я уже не боюсь...
Ответить с цитированием
  #8 (permalink)  
Старый 27.03.2014, 18:57
GOD GOD вне форума
Аспирант
Посмотреть профиль Найти все сообщения от GOD
 
Регистрация: 27.03.2014
Сообщений: 54

Не слушай ksa, он дает вредные советы. Передавай динамические данные вглубь рекурсии, тогда ты будешь знать уровень на котором находится рекурсия, например если мы на нуливом уровне, значит функция вызванна извне.



function rec(deep) {

    if(!deep) deep = 0; // по умолчанию глубина 0

    if (deep > 5) {
        alert('глубина рекурсии больше 5, дальше не пойдем, всплываем');
        return; // всплываем
    }


    alert('глубина рекурсии: ' + deep);

    // погружаемся
    // когда идем вглубь, прибавляем индекс глубины на 1
    rec(deep + 1);

    // всплываем
    alert('всплываем, и мы на уровне: ' + deep);

}



rec()

Последний раз редактировалось GOD, 27.03.2014 в 19:03.
Ответить с цитированием
  #9 (permalink)  
Старый 27.03.2014, 19:42
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,345

Сообщение от GOD
Не слушай ksa, он дает вредные советы.
Куда мне до твоего "решения"...
Ответить с цитированием
  #10 (permalink)  
Старый 27.03.2014, 19:45
GOD GOD вне форума
Аспирант
Посмотреть профиль Найти все сообщения от GOD
 
Регистрация: 27.03.2014
Сообщений: 54

ksa, Так говоришь как будто я не лучше тебя программирую.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
много переменных без массива Fedya Общие вопросы Javascript 1 10.11.2013 21:37
Помогите разобраться с механизмом вызова функции Mantorrash Общие вопросы Javascript 3 20.12.2012 07:07
Как одной функции присвоить другую с параметрами без ее вызова dmitryck Общие вопросы Javascript 23 16.06.2012 21:35
Строка вызова функции DMH Общие вопросы Javascript 11 10.08.2010 08:06
Проверка существования входного параметра для функции Axe Я не знаю javascript 2 25.05.2009 13:58