Как запустить переменную после x действий

#javascript

#javascript

Вопрос:

У меня есть следующий код. Я хочу запустить действие в функции activityDetected(eventName) только после 100 щелчков. Как это сделать?

Я знаю, что должен поместить let a = 1; a , но не уверен, где…

https://pastebin.com/SMsJsikE

 const intervalTimeout = 2000;

//here is where code should be added. let a = 1;   a...
function activityDetected(eventName) {
    console.log(`Activity detected with the event name: ${eventName}!`);
    clearInterval(activityTimeout);
    activityTimeout = setInterval(recordNoActivity, intervalTimeout);
}

document.addEventListener('click', _ => {
    activityDetected('click');
}); 

Комментарии:

1. Почему бы не объявить счетчик вне функции? pastebin.com/Rk5M49Tt

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

3. Должен ли этот счетчик быть постоянным? что происходит после 100 кликов? проверка перезапускается?

Ответ №1:

Вам нужно объявить счетчик вне функции и увеличить его на 1, когда значение eventName равно 'click' . После этого проверьте a % 100 и поместите туда любое действие, которое вы хотите вызывать каждые 100 кликов.

Посмотрите на пример кода:

 // For ease, change this to a smaller value to detect more often, higher to detect less often!
    const intervalTimeout = 2000;
    let a = 0;
     
    // Here's our interval, setting up the initial capture of no activity
    let activityTimeout = setInterval(recordNoActivity, intervalTimeout);
     
    // A single function to handle the events we're listening to.
    // clears the interval and restarts it, also tells us which event has cleared the interval!
    //here is where code should be added. let a = 1;   a...
    function activityDetected(eventName) {
        if(eventName == 'click'){
            a  ;
            if(a%100 == 0){
                // Trigger whatever you want to trigger after every 100 clicks
            }
        }
        console.log(`Activity detected with the event name: ${eventName}!`);
        clearInterval(activityTimeout);
        activityTimeout = setInterval(recordNoActivity, intervalTimeout);
    }
     
    // Set listening events
    document.addEventListener('keydown', _ => {
        activityDetected('keydown');
    });
     
    document.addEventListener('click', _ => {
        activityDetected('click');
    }); 

Комментарии:

1. Спасибо за вашу помощь и объяснение, это работает

Ответ №2:

Как правильно указали другие в этом потоке, переменная a должна быть объявлена и определена вне функции, но причина, по которой этот подход будет работать, заключается в закрытии

Поэтому, когда вызывается функция execution context , создается, который содержит

  1. scopeChain — он содержит variableObject variableObject всего родительского контекста выполнения
  2. variableObject — содержит аргументы / параметры функции, внутреннюю переменную и объявления функций
  3. это — этот контекст.

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