jquery 每个 'named function'

jquery each as 'named function'

我想使用这个语法

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

每个函数

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

这个可以吗,这个叫什么(我叫这个'named functions'对不对)?

编辑

像这样

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

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

当这样使用函数时:

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

它被称为 anonymous function 或 lambda 函数。

我从未听说过 "named function" 这个词,但我想当您将函数分配给变量时,您可以这样称呼它。

jQuery.each return 与几乎所有 jQuery 方法一样,第一个参数相当于 $("#firstname, #surname")。理解这一点非常重要,因为它是 jQuery 的关键机制之一,可以让你做一些很酷的事情,比如方法链,例如$("#firstname, #surname").each(do something).each(do even more)。这意味着,您不能 return 您在 each 方法中的错误并将其传递给构造之外的变量。

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

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

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

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

另一个想法可能是使用 jQuery.map 方法,它确实使您能够 return 一个值:

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");

过滤器将 return 仅过滤那些传递函数 return 为真值的元素,因此在这种情况下,所有具有空值的元素。您不仅可以计算元素,还可以立即突出显示空表单元素:

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

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

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

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

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

如前所述,filter() 是您应该在此处使用的内容,但希望这会在将来的某个时候对您有所帮助。