验证箭头函数参数数量的好方法?

时间:2016-09-11 01:03:55

标签: javascript ecmascript-6

显然,arguments.length不起作用。

我可以将签名更改为f: (...args) => { if (args.length>0) { ..}; };

但是这会从函数声明中删除参数信息。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

您已经弄明白了,如果您使用箭头功能,传播操作员+ .length将为您提供所需的信息。我会考虑您正在呈现的特定用例(您需要保存参数信息并知道参数的长度),因为它更适合非箭头函数:

 f: function(a, b, c) { console.log(arguments.length); }

如果您使用箭头功能来保留父上下文,则始终可以将.bind(this)添加到末尾(and incur a small performance penalty)。

我不确切地知道你需要完成什么,但是如果你没有尝试编写一个具有未知arity的函数,也许默认参数可以让你处理用户忘记所需参数的情况? ...或者您可以将参数打包在一个对象中并使用Object.keys来确定长度:

let f = (args) => console.log(Object.keys(args).length);
f({ a: 1, b: 2, c: 3 });

这将保留参数信息,并允许您确定参数的长度。

答案 1 :(得分:2)

简短的回答是:“不”或“可能”。

答案较长的是:来自MDN

  

与函数表达式相比,箭头函数表达式具有更短的语法,并且词汇绑定此值(不绑定自己的thisarguments,{{1} },或super)。箭头功能始终是匿名的。这些函数表达式最适合非方法函数,不能用作构造函数。

箭头函数的主要用途是用于回调,以执行代码,就像它在其父上下文中执行一样。因此,可以防止令人烦恼和丑陋的new.target要求并隐含地进行。

由于这个原因,并且由于它是匿名执行的,因此在父级的上下文中没有const that = this;,或者更确切地说,值是父级的上下文。箭头函数只解决一般用例,而不是每个用例。

解决方案1:遗留或“天真”实施

arguments
  • 优点
    • (目前)比箭头功能稍快
    • 拥有自己的背景(即// const that = this; var that = this; ... f: function (a, b, c) { ... } ... 等)。
    • 可以安全地在所有浏览器和环境中实施
  • 缺点
    • 恼人的arguments(或其他一些var名称)而不是that
    • 功能不能是外部的,或丢失this参考

解决方案2:功能绑定(ES5)

that
  • 优点
    • “正确”... f: (function (a, b, c) { ... }).bind(this) ... 可用
    • 可以传递任何外部函数引用(即重用代码)
    • 拥有自己的背景(即this等)。
  • 缺点
    • (目前)比箭头功能稍慢
    • 如果函数引用先前已绑定
    • ,则会出现意外结果
    • 不支持IE8和其他浏览器(我不得不提到这一点,即使我对IE8不在乎)

解决方案3:解构分配(ES6)

arguments
  • 优点
    • 匿名函数
    • 无缝访问父上下文
    • 表现出类似的行为
  • 缺点
    • (目前)比标准功能稍慢
    • 需要解构
    • 不是真实的... f: (...args) => { const [a, b, c] = args; ... } ... 实例
    • 需要在浏览器中运行一个转换程序(例如:Babel),这可能会转换为“遗留”实现