【问题标题】:Two variables passed to a function, one's undefined?两个变量传递给一个函数,一个是未定义的?
【发布时间】:2011-09-02 04:17:57
【问题描述】:

我卡住的地方:

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

我正在查看来自 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 中,但我认为它仍在从字段数组的第二个位置提取值?

【问题讨论】:

    标签: jquery function serializearray


    【解决方案1】:

    为什么函数需要两个参数?

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

    callback(indexInArray, valueOfElement)
    

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

    如果你这样定义你的回调

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

    它被称为

    callback(indexInArray, valueOfElement)
    

    那么foo 将是未定义的。

    如果您将回调定义为

    function(foo) { ... }
    

    它仍然会被称为

    callback(indexInArray, valueOfElement)
    

    foo 将包含indexInArray - 如果您“省略i”,0.value 当然将是未定义的。

    我可以使用备用变量吗?

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

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

    【讨论】:

    • 感谢 .each 上的链接,并特别感谢您介绍正在发生的事情。我认为这最终让我的大脑在整个问题上解开了!
    【解决方案2】:

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

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

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

    【讨论】:

    • 哦,它来自 DOM,好吧。这有助于澄清这个问题。感谢您的链接!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多