Есть ли способ проверить, выполняются ли определенные условия при втором вызове функции?
Поэтому я хочу вызвать функцию
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 ...
};
})();
Однако, как говорили другие, я бы сказал, что скрывать это поведение внутри функции кажется плохой идеей. Возможно, лучшее решение - это просто экстернализировать (и документировать) состояние.