在两个不同的进程之间切换功能的最佳方法是什么?

时间:2011-06-02 20:46:36

标签: javascript

我有一个函数,我希望它在每次触发时执行交替进程。关于如何实现这一目标的任何帮助都会很棒。

function onoff(){
    statusOn process /*or if on*/ statusOff process
}

7 个答案:

答案 0 :(得分:7)

JavaScript的一个有趣的方面是函数是第一类对象,这意味着它们可以具有自定义属性:

function onoff() {
    onoff.enabled = !onoff.enabled;
    if(onoff.enabled) {
        alert('on');
    } else {
        alert('off');
    }
}

为此,您的功能应该有一个名称。如果您的函数是匿名的(未命名),您可以尝试使用arguments.callee来访问它,但在新的ES5标准中不推荐使用它,并且在使用其严格模式时不可以。

答案 1 :(得分:5)

通过使用闭包,您可以定义一个只能由函数本身访问的静态变量:

var toggle = (function()
{
    var state = true;

    return function()
    {
        if(state)
            alert("A");
        else
            alert("B");

        state = !state;
    };
})();

现在您可以反复调用toggle(),它会在"A""B"之间切换。 state变量无法从外部访问,因此您不会污染全局变量范围。

答案 2 :(得分:3)

使用闭包。除了闭包之外,这个方法还演示了任意参数和任意数量的函数来循环

功能循环器

function cycle() {
    var toCall = arguments;
    var which = 0;
    return function() {
        var R = toCall[which].apply(this, arguments);
        which = (which+1) % toCall.length;  // see NOTE
        return R;
    }
}

演示:

function sum(a,b) {return a+b}
function prod(a,b) {return a*b}
function pow(a,b) {return Math.pow(a,b)}
function negate(x) {return -x;}

var f = cycle(sum, prod, pow, negate);
console.log(f(2,10)); // 12
console.log(f(2,10)); // 20
console.log(f(2,10)); // 1024
console.log(f(2));    // -2
// repeat!
console.log(f(2,10)); // 12
console.log(f(2,10)); // 20
console.log(f(2,10)); // 1024
console.log(f(2));    // -2

任意循环仪

或者,如果您不希望假设所有循环的东西都是函数,则可以使用此模式。在某些方面它更优雅;在某些方面它不那么优雅。

function cycle() {
    var list = arguments;
    var which = 0;
    return function() {
        var R = list[which];
        which = (which+1) % toCall.length;  // see NOTE
        return R;
    }
}

演示:

var cycler = cycle(function(x){return x}, 4, function(a,b){return a+b});
cycler()(1);   // 1
cycler();      // 4
cycler()(1,5); // 6
// repeat!
cycler()(1);   // 1
cycler();      // 4
cycler()(1,5); // 6

注意:因为javascript认为10000000000000001%2是0(即这个数字是偶数),这个函数必须比所需的时间长三个,否则你只能在它之前调用这个函数10千万亿次给出了错误的答案。您不太可能在单个浏览会话中达到此限制...但谁知道

答案 3 :(得分:2)

如果我理解你想要的东西,这可能就是你要找的东西:

var AlternateFunctions = function() {
    var one = function() {
        // do stuff...

        current = two;
    }, two = function() {
        // do stuff...

        current = one;
    }, current = one;
    return function() {
        current();
    }
}();

然后调用AlternateFunctions();将在one()two()

之间循环

答案 4 :(得分:1)

已经发布了几个好的答案,但我想知道你想要实现的目标。如果你跟踪一些DOM元素的状态,而不是在函数中保存状态,你应该检查元素的状态,以便函数不在真空中运行(并且可能没有按照你的预期运行)。您可以检查一些属性,例如class:

function onoff(obj){
    if(obj.className === 'on') {
        obj.className = 'off';
    }else{
        obj.className = 'on';
    }
}

答案 5 :(得分:0)

var last=0;
function toggle() {
   if(last) {
      last=0;
      // do process 2
   }
   else {
      last=1;
      // do process 1
   }
}

答案 6 :(得分:0)

请参阅jsfiddle demo

var status=true;  
function onOff(el){
         /*
         * toggle
         */
        status = (status ? false : true);

        status
                ? el.html('on')
                : el.html('off');
   }