传递给函数的两个变量,一个未定义?



我被卡住的地方:

在业余时间,我在一个私人网站上工作。我的自学真的是没有结构的,我的基础知识遇到了一个巨大的漏洞。

我正在看jQuery API网站serializeArray上的jQuery示例,我无法理解ShowValues函数。

情况如下:

function showValues() {
  var fields = $(":input").serializeArray();
  $("#results").empty();
  jQuery.each(fields, function(i, field){
    $("#results").append(field.value + " ");
  });
}
$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();

我很确定,除了第4行和第5行:之外,我什么都明白

  jQuery.each(fields, function(i, field){
    $("#results").append(field.value + " ");

jQuery遍历字段数组中的每个键,并将其发现的内容放入通用函数:函数(i,字段)

该函数使用它的两个参数生成一个字符串,将其附加到#results。

我的问题

为什么该函数需要两个参数?每次运行函数时,变量i似乎从零开始计数。如果从函数中取出,field.value将返回undefined。

由于进入双参数函数的值被排列成一个数组,因此函数必须……与数组的维度匹配?

i是特殊的,还是可以使用任何备用变量?

field.value发生了什么?.value不在jQuery API中,但我认为它仍在从字段数组的第二个位置提取值?

为什么函数需要两个参数

首先,你应该阅读.each的文档。它告诉你它期望一个定义如下的函数:

callback(indexInArray, valueOfElement)

这已经决定了,所以你必须遵守它(推理超出了这个答案)。

如果您将回调定义为这样的

function(indexInArray, valueOfElement, foo) { ... }

它被称为

callback(indexInArray, valueOfElement)

则CCD_ 4将是未定义的。

如果您将回调定义为

function(foo) { ... }

它仍将被称为

callback(indexInArray, valueOfElement)

并且CCD_ 5将包含indexInArray-并且如果"省略i",则0.value当然将是未定义的。

我可以使用备用变量吗

是的,你可以。在大多数函数式语言中,您会发现_用于您不关心的参数(但如果您使用像underscore.js这样的库,请小心)。可以使用任何其他名称。

$(...).each(function(_, elem) {
  ...
});

jQuery.each针对数组或对象中的每个键/值对运行您提供的函数(此处为匿名函数)。这很像函数语言中的迭代。

参数名称既不特殊,也不是必需的。调用函数时,当前值为this,因此在许多情况下可以省略它们。例如,在您的代码中,函数可以更改为function() { $("#results").append(this.value + " "); },它将产生相同的结果。

在函数内部,field是DOMElement,.value是用于访问输入的value=属性的DOM 0属性。在您的代码中,field.value等效于$(field).val()

我相信I被传递给Jquery的内部工作,让它计算出在函数中传递/使用数组中的哪个值。如果没有i,Jquery就无法判断它在迭代中的位置。

相关内容

  • 没有找到相关文章

最新更新