Javascript 如何将函数同时作为事件处理程序和接受参数的可调用函数编写?

Javascript 如何将函数同时作为事件处理程序和接受参数的可调用函数编写?,javascript,jquery,this,Javascript,Jquery,This,下面是一个用作事件处理程序的函数,它利用了this: function validate() { if (this.val() == '') { return false; } } $(':input').change(validate); function validate() { if ($(this).val() == '') { return false; } } // Unchanged. $(':input').change(validate);

下面是一个用作事件处理程序的函数,它利用了
this

function validate() {
  if (this.val() == '') {
    return false;
  }
}

$(':input').change(validate);
function validate() {
  if ($(this).val() == '') {
    return false;
  }
}

// Unchanged.
$(':input').change(validate);

// Use `$(...)` as "this" when calling validate.
validate.apply($('#customer_name'));
这里的函数重写为接受一个参数,因此我可以显式调用它:

function validate(field) {
  if ($(field).val() == '') {
    return false;
  }
}

validate($('#customer_name'));

如何重写我的
validate
函数,使其既适合作为事件处理程序使用,又适合作为我调用的独立函数使用?

有多种方法可以做到这一点。一种是使用第二种方法,将字段作为参数,并使用闭包设置事件处理程序:

function validate(field) {
  if ($(field).val() == '') {
    return false;
  }
}

// Use anonymous function to pass "this" to validate.
$(':input').change(function() { validate(this); });

// Unchanged.
validate($('#customer_name'));
另一种方法是使用第一个表单并使用重写的
this
调用它:

function validate() {
  if (this.val() == '') {
    return false;
  }
}

$(':input').change(validate);
function validate() {
  if ($(this).val() == '') {
    return false;
  }
}

// Unchanged.
$(':input').change(validate);

// Use `$(...)` as "this" when calling validate.
validate.apply($('#customer_name'));

如果
字段
未作为参数提供,则使用此的回退

function validate(field) {
    return $(field || this).val() != '';
}

$(':input').change(validate); // using this context
validate($('#someInput'));    // using a parameter

+1表示应用()。IMHO.PS是更好、更惯用的替代方案:您的第二个代码示例中有一个错误。我认为它应该是函数体中的
$(this)