将每个jquery命名为'命名函数'

时间:2015-02-10 13:50:27

标签: javascript jquery function each

我想使用这种语法

var x = function() {
      //do something here
}

每个函数

$("#firstname, #surname").each(function( index ) {
  if ($(this).val() == '') {
    errors += 1;
    }
});

这是可能的,这叫做什么(我称之为'命名函数'是正确的吗?)

修改

这样的事情

var errors = $("#firstname, #surname").each(function( index ) {
  if ($(this).val() == '') {
    errors += 1;
  }
  return errors;
});

console.log("you have".errors()."errors");

2 个答案:

答案 0 :(得分:0)

当使用这样的函数时:

$(...).each(function() {
   ...
});

它被称为anonymous function或lambda函数。

我从未听过“命名函数”这个术语,但我猜你可以这样称呼它,当你将函数赋值给变量时。

jQuery.each几乎所有jQuery方法都返回第一个参数,相当于$("#firstname, #surname")。这是非常重要的理解,因为它是jQuery的关键机制之一,并使您能够做方法链等很酷的东西,例如$("#firstname, #surname").each(do something).each(do even more)。这意味着,您无法在each方法中返回错误并将其传递给构造外部的变量。

您可以增加一个全局变量:

var errors = 0
$("#firstname, #surname").map(function() {
   if ($(this).val() == '') {
      errors++
   }
});

console.log("you have" + errors + "errors");

请注意字符串连接符+,而不是.

另一个想法可能是使用jQuery.map方法,这确实可以让您返回一个值:

var errors = $("#firstname, #surname").map(function() {
   if ($(this).val() == '') {
      return 1
   }
   return 0
});

但是这只会给你留下一系列10元素,这些元素与你的开始元素大致相同。您需要添加另一个循环来将元素汇总在一起。

最后让我们来看jQuery.filter方法,这应该就是你需要的方法:

var errors = $("#firstname, #surname").filter(function() {
  return $(this).val() == "";
}).length;

console.log("you have " + errors + " errors");

Filter只返回传递函数返回truthy值的元素,因此在这种情况下,所有元素都具有空值。您不仅可以计算元素,还可以立即突出显示空表单元素:

var errors = $("#firstname, #surname").filter(function() {
  return $(this).val() == "";
}).css("background-color", "red").length;

console.log("you have " + errors + " errors");

答案 1 :(得分:0)

您的示例有一个简单的解决方案,因为您可以使用过滤器并观察结果的长度,但一般来说,reduce()是当您想要聚合有关所有项目的内容时使用的操作收集到单个值。

jQuery doesn't have a reduce() method,但是ES5 arrays do,所以你可以像这样使用它:

var errorCount = $("#firstname, #surname").toArray().reduce(function(count, item) {
    return count + ($(item).val() === '' ? 1 : 0);
}, 0);

如前所述,filter()是你应该在这里使用的,但希望这将在未来的某个时候帮助你。