【问题标题】:jQuery underscore as first arg of functionjQuery 下划线作为函数的第一个参数
【发布时间】:2013-04-23 20:48:10
【问题描述】:

我有以下代码sn-p:

标记:

<tr name="tr3" id="tr3">
    <td>
        <input type="text" class="common_cls" name="dt[]" id="dt1"> 
    </td>
    <td>
        <input type="hidden" name="fn[]" id="fn1">
        <span id="sp1"><a href="#" id="ah1">choose file</a><span>
        <input type="file" name="fff[]" id="ff">
        <input type="text" style="display:none">
    </td>
</tr>';

JAVASCRIPT

$(document).on('click', '#add_row', function() {
    var row = $("table#DocTable tr:eq(3)");
    row.clone(true)
        .show()
        .find("a, input, span").each(function() {
            $(this)
                .val('')
                .attr('id', function(_, id) {
                    var newcnt = id + count;
                    return id + count;
                });
        })
        .end()
        .appendTo("table");
    count++;

这是我一年多前写的,我在有问题的地方得到了帮助。

下划线作为 .attr 方法中调用的函数的第一个参数的目的是什么?

该功能究竟是如何工作的?它是否只是用递增的数字替换所有aspaninput 标记中的当前id

【问题讨论】:

    标签: jquery


    【解决方案1】:

    下划线通常用作未命名变量的占位符。基本上,如果您不打算使用该变量,则无需为其查找名称,因此您只需使用下划线即可。

    不要与 i18n 下划线函数或 underscore.js 混淆。

    P.S.:我不确定这种做法是从哪里来的,但是我第一次看到下划线被用于某事是在我学习 Prolog 时(其中_ 实际上意味着类似于“任何值”)。

    【讨论】:

    • 为什么需要那个未使用的变量?为什么不直接写function(id){//blah blah blah}
    • @gibberish 因为第一个参数包含索引,并且您想要的值不是索引。
    • @gibberish,你可以随心所欲地调用你的函数参数,JS 解释器无法猜测id 你实际上是指第二个参数而不是第一个参数。不幸的是,JS 不支持“关键字参数”。
    【解决方案2】:

    在这种情况下,当前元素的索引存储在_ 中。该函数所做的只是使用该元素的 id + count 更新每个元素的属性。如果您改为将其命名为 indexi,您可能已经猜到它包含索引..

    【讨论】:

      【解决方案3】:

      与此答案相关的方面有很多,分散在 cmets 和其他答案中。因此,我将尝试将它们合并到下面:

      首先,在提到的这段代码中,下划线参数的使用如下:-

      $(this).val('').attr('id', function(_, id) { return id + i });
      

      attr 函数here 的jQuery 文档中,存在attr 的重载形式,即.attr( attributeName, function )。这种形式的function被描述为

      类型:函数(整数索引,字符串属性)

      因此,它需要两个参数。然而,在我们的代码中,我们只需要id,它恰好是第二个参数。

      现在,由于 JS 处理函数参数的方式,我们不能将其写为 function(id),因为 JS 会将 id 映射到 indexfunction 预期的第一个参数)。因此,我们编写的函数需要有两个参数。

      在这里,一个标准的约定开始发挥作用。正如here所提到的,

      下划线字符 (_) 用作指示未使用的函数参数的标准方式。

      但是,这只是一个约定,而不是规则。我们也可以将未使用的参数命名为indexunused。也就是说,

      $(this).val('').attr('id', function(unused, id) { return id + i });
      

      将是一个有效的等价物。

      因此,这种使用 _ 代替未使用参数的用法可以用于任何其他具有类似重写形式的 jQuery 函数。例如,在this 的答案中,我们可以看到在对$.text() 的调用中使用了下划线。只是为了确认一下,$.text() 有一个重写的形式,它接受一个带有两个参数的函数,如 here 所示。

      【讨论】:

        【解决方案4】:

        嗯,这只能由作者来回答。 _ 是函数第一个参数的名称。

        根据我可以看到的代码,我猜测,由于函数中根本没有使用 _ 变量,因此该函数中不需要第一个参数,因此它已被“删除”使用 _ 而不是随机名称。

        【讨论】: