有没有办法在第二次调用函数时检查某些条件是否为真?

时间:2014-02-17 08:15:31

标签: javascript

所以我想调用一个函数

myfunction();

我希望能够让我的代码调用一次并且没问题,但是如果我的代码第二次调用它,我想检查某些条件是否为真,如果是,我希望函数不是跑。如果这些条件不成立,那么我希望函数像往常一样运行。我只是想知道某个特定的东西是否只适用于第二次调用该函数而不允许我的函数再次运行,直到这些条件不再为真。

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

我想在第二次调用函数时总是这样做。所以第一个函数调用,没有检查。在第二个电话,检查。在第3次呼叫时没有检查,在第4次呼叫检查等。基本上,每次其他呼叫该功能,检查是否有某些条件是真的 如果是,则不要运行功能代码。我非常感谢你的回复。

5 个答案:

答案 0 :(得分:1)

这很容易。因为您正在寻找的内容基本上是根据某种内部状态修改其行为的函数,所以它是对象的理想应用程序:

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

如果你绝对必须只有一个函数(没有对象),你可以使用immediately-invoked function expression (IIFE)来返回一个函数:

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

这具有封装calls变量的优点:在没有函数之外的情况下无法访问或篡改。

作为警示,这实现了所谓的“副作用”:也就是说,如果不理解函数的细节,就不能再预测函数的行为。我不会说教,并且说副作用总是很糟糕,但是你必须要小心它们:确保它们有意义,并且你的文档清楚地知道发生了什么。

答案 1 :(得分:1)

你需要一个在函数范围之外的索引变量 像这样的东西:

var index = 0;

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

答案 2 :(得分:0)

您可以使用闭包:而不是

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 ...
               };
          })();

正如其他人所说,但是我会说保持这种行为隐藏在函数中似乎是一个坏主意。可能更好的解决方案就是外化(并记录)状态。

答案 3 :(得分:0)

这不是你问题的答案。

肯定会有答案告诉你如何做到这一点,但我认为“唯一的胜利就是不去玩。”

在调用make之间具有不同行为的函数会使您的软件很难处理(维护,测试,调试,推理)。

如果有理由要求函数在调用之间表现不同,请将其设置为系统状态,而不是纯粹关于函数本身。

答案 4 :(得分:0)

同意pkyeck,但为什么要增加var。

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