| 
 Ограничение на количество вызовов функции за время < 10мс Здравствуйте! Очень нужна помощь. Есть функция, которая, так получилось, вызывается очень часто за короткий промежуток времени. Нужно сделать так, чтобы количество её вызовов не превышало 5 за 10мс. Сама функция: function game(i,j) { if (self.X[i] === self.X1[j] && (self.Y[i] === self.Y1[j] + 1 || self.Y[i] === self.Y1[j] - 1)) { //console.log('Игра'); cell_game++; } else if (self.X[i] === self.X1[j] - 1 && (self.Y[i] === self.Y1[j] || self.Y[i] === self.Y1[j] + 1 || self.Y[i] === self.Y1[j] - 1)) { //console.log('Игра'); cell_game++; } else if (self.X[i] === self.X1[j]+1 && (self.Y[i] === self.Y1[j] || self.Y[i] === self.Y1[j] + 1 || self.Y[i] === self.Y1[j] - 1 )) { //console.log('Игра'); cell_game++; } } Благодарю заранее. | 
| 
 Примерно так: 
runsCounter = 0;
lastTime = (new Date()).getTime();
function game(){
	
	if ((new Date()).getTime() - lastTime <= 10) {
		++runsCounter;/*Увеличиваем счетчик исполнений*/
		if (runsCounter < 6) {
		/*Здесь ты можешь выполнять свой код*/
		}
	}
	else {
		/*Начался новый интервал времени, поэтому все переменные выставляем в дефолт*/
		lastTime = (new Date()).getTime();
		runsCounter = 0;
	}
}
 | 
| 
 demoniqus, неа. Если например 1 вызов будет на первой мс, затем 4 на десятой, потом 4 на первой и 1 на десятой, то получится 8 вызовов за 2 мс.) Тут надо хранить время последних четырёх вызовов и от него отталкиваться. | 
| 
 Aetae, какая хитропопая трактовка))))))))))) Я о таком варианте не думал как-то... Тогда примерно так: 
nowIteration = 0;
iterationLimit = 5;
timeLimit = 10;
historyTimes = {};
for (var i = 0; i < iterationLimit; ++i) {
	historyTimes[i] = (new Date()).getTime();
}
function game(){
	var t = (new Date()).getTime();
	/*Следующая итерация является самой старой по отношению к текущей, поэтому сравниваем с ее временем*/
	nextIteration = nowIteration + 1;
	nextIteration >= iterationLimit && (nextIteration = 0);
	if (t - historyTimes[nextIteration] > timeLimit) {
		historyTimes[nowIteration] = t;
		nowIteration = nextIteration;
		
		/*Основной код процедуры*/
	}
}
Храним историю необходимого количества операций. При каждой попытке вызова требуемой функции сравниваем текущее время с самой ранней из всех записей в данной истории, индекс которой на единицу больше текущей итерации. Если в первом случае временные отрезки исчислялись последовательно без наложения и действительно возникала та ситуация, которую ты описал, то во втором примере подобного уже не должно быть. | 
| 
 | 
| 
 nerv_, прочитай внимательней условие.) Яб написал примерно так: 
game = limit(game, 5, 10)
function limit(func, count, time){
    var result, array = new Array(count);
    return function(){        
        if(time > new Date() - array[0]) return result; //возвращаем результат последнего вызова
        result = func.apply(this, arguments); //исполняем функцию в текущем контексте с нужными аргументами
        array.shift();     
        array.push(new Date());
        return result;
    }
}
 | 
| 
 :write:  мысли вслух -- не более 3 кликов за 5 сек  
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
</head>
<body>  <input name="" type="button" value="test" onclick="game(this)">
<script>
var counter = 3,
    time = 5000,
    temp = [],
    n = 0;
function game(obj) {
    temp.push((new Date()).getTime());
    var ok = limit(temp, time)
    obj.style.backgroundColor = ok ? "lime" : "red"
    n += +ok;
    obj.value = n;
}
function limit(arr, time) {
    var sum = 0;
    for (var i = arr.length - 1, a, b; a = arr[i--];) {
        b = arr[i];
        b && (sum += (a - b));
        sum > time && (arr.splice(0, i + 1))
    };
    var ok = sum > time || arr.length <= counter;
    !ok && arr.pop();
    return ok
}
</script>
</body>
</html>
 | 
| 
 Цитата: 
 http://learn.javascript.ru/play/uUXAV | 
| Часовой пояс GMT +3, время: 04:43. |