Есть ли способ проверить, выполняются ли определенные условия при втором вызове функции?

Поэтому я хочу вызвать функцию

myfunction();

Я хочу, чтобы мой код вызывал его один раз и все было в порядке, но если мой код вызывает его второй раз, я хочу проверить, выполняются ли определенные условия, и если да, то я хочу, чтобы функция не выполнялась. Если эти условия не выполняются, я хочу, чтобы функция работала как обычно. Я просто хочу знать, является ли что-то конкретное истинным только для второго вызова функции и не позволять моей функции запускаться снова, пока эти условия больше не выполняются.

if(condition) {
//don't run function code for as long as this is true. 
}
else{
//business as usual, run the code
}

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

5 ответов

Решение

Это достаточно просто. Поскольку то, что вы ищете, это в основном функция, которая изменяет свое поведение в соответствии с некоторым внутренним состоянием, это идеальное приложение для объектов:

var o = {
    calls: 0,
    fn: function(){
        if(++this.calls%2){
            console.log('odd call');
        } else {
            console.log('even call');
        }
    }
}

Если вам абсолютно необходима только функция (без объекта), вы можете использовать выражение для немедленного вызова функции (IIFE) для возврата функции:

var fn = (function(){
    var calls = 0;
    return function(){
        if(++calls%2){
            console.log('odd call');
        } else {
            console.log('even call');
        }
    }
})();

Это имеет преимущество инкапсуляции calls переменная: к которой нельзя получить доступ или вмешаться без использования функции.

В качестве предостережения, то, что это достигается, называется "побочным эффектом": то есть поведение функции больше не может быть предсказано без понимания деталей функции. Я не собираюсь быть догматичным и скажу, что побочные эффекты всегда плохие, но вы должны быть осторожны с ними: убедитесь, что они имеют смысл, и что ваша документация ясно о том, что происходит.

Вам нужна переменная индекса за пределами области действия функции.
что-то вроде этого:

var index = 0;

function myFunction() {
    // TRUE on every second call
    if (++index % 2 === 0) {
        if (condition) {
             // ....
        } else {
            // ...
        }
    }
    // ....
}

Согласитесь с pkyeck, но зачем увеличивать вар.

var checkCall = 1;
function myfunction(){
    if(checkCall){
        alert('true: so no code will run');
        checkCall = 0;
    } else {
        alert('run the code');
        checkCall = 1;
    }
}

Это не ответ на ваш вопрос.

Наверняка будут ответы, которые подскажут вам, как это сделать, но я бы сказал, что "Единственный выигрышный ход - не играть".

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

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

Вы можете использовать замыкание: вместо

function f(x, y, z) {
    ... normal processing ...
}

создать закрытие, что каждый второй вызов будет делать проверку

var f = (function(){
           var do_check = true;
           return function(x, y, z){
               do_check = !do_check;
               if (do_check && ... check ...) {
                  ... special handling ...
               } else {
                  ... normal processing ...
               };
          })();

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

Другие вопросы по тегам