【问题标题】:It there a way to leave a function argument undeclared有一种方法可以保留未声明的函数参数
【发布时间】:2017-02-28 07:13:34
【问题描述】:

我正在寻找一种在不声明一个或多个参数的情况下声明函数的方法。这将用于您正在实现一个函数而您不关心(例如)第一个参数的值是什么的情况。

例如,给定这个函数:

function foo(this_arg_is_unused, important_arg) {
    doSomethingWith(important_arg);
}

有没有办法像这样声明它?

function foo( , important_arg) {
    doSomethingWith(important_arg);
}

我意识到我可以轻松做到这一点:

function foo() {
    doSomethingWith(arguments[1]);
}

然而,这开始变得不那么可读了,并且(例如)使用 fn.js 来柯里化参数会更加困难。

我目前在想也许我可以使用视觉助记符来指示未使用该参数:

function foo(ø, important_arg) {
    doSomethingWith(important_arg);
}

但是这也可能存在可读性问题。

现实世界的例子:

jQuery's .each() 使用的回调函数有两个参数,第一个是数组/对象中的索引或属性名称,第二个是值。要操作一些 div 元素,您可以执行以下操作:

$($('div').each(function(index, value) {
        console.log(value); // equivalent to doSomething(this)
    }));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Nothing here</div>

使用箭头函数(无法使用 arguments[])

$($('div').each((ø, value) =&gt; console.log(value)));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Nothing here</div>

【问题讨论】:

  • 我不认为 JavaScript 对此有任何语言支持。 Haskell 约定是使用以下划线开头的名称(例如_index)。
  • @joews 你没看过真实世界的例子吗?经常。大多数人甚至都懒得为.each() 参数提供回调,因为this 很方便——但你不能在箭头函数中使用this
  • 我总是使用_ 作为无关参数。
  • ...你可以像function x(...a){ carryOnWith(...a.slice(1)) }一样做
  • @Redu _ 也是我的首选,但至少有几个库正在使用它(下划线、gettext),我想避免潜在的问题

标签: javascript syntactic-sugar


【解决方案1】:

有没有办法不声明函数参数?

没有。只是省略它是一个语法错误。

也许我可以使用视觉助记符来指示未使用该参数

是的,这是正确的方法。未使用参数的惯用名称是下划线_,在其他具有特殊含义的语言中已知(甚至可以多次使用):

function foo(_, important_arg) {

现实世界的例子:jQuery的.each()使用的回调函数

是的,jQuery 搞乱了回调的参数顺序,通常是值在前。在 jQuery 中,值在 zeroeth 参数中 - this 值,所以惯用的 jQuery 是

$('div').each(function() {
    console.log(this);
});

如果由于某种原因不能使用this,则必须使用第二个参数;没有办法解决这个问题。

【讨论】:

  • 我想使用_,但它会破坏gettext(这就是我倾向于使用“null”的原因)。我知道 jQuery 成语,但它在箭头函数中失败了。
  • @Tibrogargan “gettext”是什么意思?是的,you're not supposed to use arrow functions everywhere - jQuery 在这方面可能被认为是坏的,但出于兼容性原因,他们几乎不会改变它(就像在 JS 中一样)。
  • gettext。有许多语言的库,其中许多(包括 JS)使用_ 作为它们的宏/全局/钩子
  • 如果您需要避免冲突,我想使用两个下划线 (__) 也可以。或者只是将其命名为index 并且根本不使用它。
  • 或者使用 joews 答案(在功能上与 fn.js:curry() 相同)。我在想也许 [Haskell 风格] __ / _xyz / _unused 可能是最简单的,但也许我会坚持我的 ø
【解决方案2】:

您不能在函数参数中留有空格。占位符参数效果很好。

如果您不想这样做,您可以编写一个包装函数的高阶函数,以期待第一个一次性参数:

function withExtraArg(f, thisValue = null) {
  return (x, ...args) => f.call(thisValue, ...args);
}

并编写带有自然数量参数的函数:

function withExtraArg(f, thisValue = null) {
  return (x, ...args) => f.call(thisValue, ...args);
}

// your function
function log (value) {
  console.log(value)
}

$($('div').each(withExtraArg(log)));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Nothing here</div>

【讨论】:

  • f.call(args) 看起来不对。你的意思是f(...args)?这将忽略 this 值。
  • 在您评论时已修复 :-)
  • 还是不行,需要f.call(thisArg, ...args)或者f.apply(thisArg, args)
猜你喜欢
  • 2020-12-15
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多