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

时间:2011-05-25 22:52:53

标签: jquery function serializearray

我被卡住的地方:

在业余时间,我在私人网站上工作。我的自我教学真的非结构化,而且我已经遇到了我的基本面上的一个巨大漏洞。

我正在查看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遍历 fields 数组中的每个键,并将通过泛型函数找到的内容放入: function(i,field)

该函数使用其两个参数来生成要附加到#results的字符串。

我的问题

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

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

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

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

3 个答案:

答案 0 :(得分:2)

为什么该功能需要两个参数?

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

callback(indexInArray, valueOfElement)

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

如果您将回调定义为

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

,它被称为

callback(indexInArray, valueOfElement)

然后foo将被定义。

如果您将回调定义为

function(foo) { ... }

它仍将被称为

callback(indexInArray, valueOfElement)

foo将包含indexInArray - 如果您“遗漏0.value”,i当然会被取消定义。

我可以使用备用变量吗?

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我相信我会被传递给Jquery的内部工作,因为它可以计算出在函数中传递/使用的数组中的哪个值。没有我Jquery无法告诉它在迭代中的位置。