2016-05-14 25 views
1

随着阵列解构,有可能通过插入逗号前没有一个参考丢弃主导项:为什么我不能跳过函数签名中的参数赋值?

const [ , two ] = [ 1, 2 ] 

同样不函数签名的真实 - 下面的代码将不解析因为在前导逗号签名是意想不到的:

function ditchFirstArgument(, second){} 

为什么我需要为ES6函数表达式中的引用参数提供引用?

+4

你在找什么样的答案? “因为语言不允许”?如果您要求*设计决策的理由*,SO并不是一个好的选择(因为这里的大多数人不会使用ECMAScript) –

+1

这会导致极其专业化的功能,而且重用性极差。甚至更糟:这些函数的命名将是一场噩梦:D – rand

+0

嗨费利克斯,我赞赏大多数人没有设计Javascript,但仍然认为堆栈溢出将是一个很好的地方获得技术解释为什么语言不会让我这样做。我完全期望许多SO用户不会有答案 - 这很好:) – Barney

回答

3

为什么我需要为ES6函数表达式中的主要参数提供参考?

因为否则它会是一个语法错误。不仅仅是ES6,而是任何版本的语言,你都不能忽略形式参数,因为规范没有提供它。

如果你真的想这样做(但为什么呢?),你可以把它写成

function ditchFirstArgument(...[, second]) {} 

,或者至少,你将能够在将来的某个ES版本;见https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50。 Chrome似乎已经支持这个功能。同时,你能做的最好的是

function ditchFirstArgument(...args) { 
    const [, second] = args; 

但为什么规范不允许的参数,省音?

你应该去问谁写它的人,但他们可能甚至从来没有考虑过,或者如果他们这么做,拒绝它,因为它是容易出错的,几乎没有必要的,而且很容易被周围的工作使用虚拟形式参数如_

+1

需要注意的是,如果使用lodash或下划线,则可能需要使用'__'(两个下划线),因此它不会影响全局'_'(单下划线)变量。 – Sukima

1

我相信这是一个常见的模式来命名以下划线未使用的变量:

function ditchFirstArgument(_, second) { /* ... */ } 

虽然它不会阻止你实际使用这个变量(如在Go),这似乎是一个非常简单的解决方法。

1

Roman's insight从围棋是有用的,但不恰当的JS那里令牌_is a valid reference,通常使用由Underscore后来Lodash库。

即使这是可以接受的,你也必须为每个未使用的参数创建和避免冲突引用,这是不理想的。

但是,有可能将destructure a function argument转换为空对象,它可以在没有参考的情况下有效地使参数无效。

function take_third({}, {}, third){ 
    return third 
} 
相关问题