JavaScript只允许在某些条件为真时执行各种函数

JavaScript只允许在某些条件为真时执行各种函数,javascript,jquery,Javascript,Jquery,我有一个附加到各种元素的事件处理程序列表,但是当某个条件为真时,我想禁用其中的一些。该条件(即布尔值)会动态变化,并且在变化时不可预测。以下是我目前的工作 function foo () { if (someCondition) { return; } // foo does something } function bar () { if (someCondition) { return; } // bar

我有一个附加到各种元素的事件处理程序列表,但是当某个条件为真时,我想禁用其中的一些。该条件(即布尔值)会动态变化,并且在变化时不可预测。以下是我目前的工作

function foo () {
    if (someCondition) {
        return;
    }

    // foo does something
}

function bar () {
    if (someCondition) {
        return;
    }

    // bar does something
}

...etc

这是可以的,但是在每个函数中都有if块确实是多余的。有没有更简洁的方法来处理这个问题?我想知道是否可以将两个事件处理程序附加到一个元素,并且在另一个元素返回true时仅执行一个事件处理程序。

您可以编写一个函数,将函数转换为仅在条件为true时运行的函数:

function conditionalize( fn ) {
  return function() {
    if (someCondition) return;
    return fn.apply(this, arguments);
  };
}
然后:


您可以编写一个函数,将函数转换为仅在条件为true时运行的函数:

function conditionalize( fn ) {
  return function() {
    if (someCondition) return;
    return fn.apply(this, arguments);
  };
}
然后:


您可以使用委托方法,如jQuery事件处理方法,请尝试以下方法:

var callbacks = [foo, bar];

function delegate() { // this is the only event handler
    var i, len;
    for(i=0, len = callbacks.length; i < len; i++) {
        if(callbacks[i].apply(this, arguments)){
            continue; // return value of this callback is true then continue
        } else {
            break; // ignore other callbacks
        }
    }
}

function foo () {
    // foo does something
}

function bar () {
    // bar does something
}
var回调=[foo,bar];
函数委托(){//这是唯一的事件处理程序
变量i,len;
for(i=0,len=callbacks.length;i
您可以使用委托方法,如jQuery事件处理方法,请尝试以下方法:

var callbacks = [foo, bar];

function delegate() { // this is the only event handler
    var i, len;
    for(i=0, len = callbacks.length; i < len; i++) {
        if(callbacks[i].apply(this, arguments)){
            continue; // return value of this callback is true then continue
        } else {
            break; // ignore other callbacks
        }
    }
}

function foo () {
    // foo does something
}

function bar () {
    // bar does something
}
var回调=[foo,bar];
函数委托(){//这是唯一的事件处理程序
变量i,len;
for(i=0,len=callbacks.length;i
正如前面提到的
foo
bar
是事件处理程序,在事件处理程序上下文
中,此
指向目标元素而非全局对象我删除了我的注释,我明白为什么了!Thx尖头!你应该使用
apply
函数而不是
call
@ABFORCE哇,我读了你的评论,心想,“哎呀,这个人疯了,因为我确实使用了
apply
”,然后我看了看:)谢谢!正如前面提到的
foo
bar
是事件处理程序,在事件处理程序上下文
中,这个
指向的是目标元素而不是全局对象我删除了我的注释,我明白为什么了!Thx尖头!你应该使用
apply
函数而不是
call
@ABFORCE哇,我读了你的评论,心想,“哎呀,这个人疯了,因为我确实使用了
apply
”,然后我看了看:)谢谢!在我看来,你的方法很好。这并不需要太多的代码,对于新的读者来说是很清楚的,并且它允许在每个函数的基础上改变条件。你甚至可以把它压缩成一行而不影响可读性。对,我同意这样做可能没有错。如果我能避免多次编写相同的代码行,我个人会觉得更有条理。我相信在某些情况下,这是必要的,但我会首先寻找一种更简洁的方法。集中决策是个好主意。如果您的应用程序发展到决策变得更加复杂,那么您必须在很多地方对其进行更改。我认为,您的方法是很好的。这并不需要太多的代码,对于新的读者来说是很清楚的,并且它允许在每个函数的基础上改变条件。你甚至可以把它压缩成一行而不影响可读性。对,我同意这样做可能没有错。如果我能避免多次编写相同的代码行,我个人会觉得更有条理。我相信在某些情况下,这是必要的,但我会首先寻找一种更简洁的方法。集中决策是个好主意。如果应用程序的发展使得决策变得更加复杂,那么您必须在很多地方对其进行更改。