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

问题描述 投票:0回答:2

显然arguments.length不起作用。

我可以将签名更改为

f: (...args) => { if (args.length>0) { ..}; };

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

还有更好的办法吗?

javascript ecmascript-6
2个回答
5
投票

简短的回答是:“不”,或“也许”。

较长的答案是:来自 MDN :

与函数表达式相比,arrow function 表达式的语法更短,并且在词法上绑定 this 值(不绑定其自己的

this
arguments
super
new.target
)。箭头函数始终是匿名的。这些函数表达式最适合非方法函数,并且不能用作构造函数。

箭头函数的主要用途是回调,执行代码就像在其父上下文中执行一样。从而防止烦人且丑陋的

const that = this;
要求并隐式执行。

出于这个原因,并且由于它是匿名执行的,因此在父级上下文中,没有

arguments
,或者更确切地说,该值是父级上下文的。箭头函数只能解决一般用例,而不是所有用例。


解决方案 1:遗留或“幼稚”实施

// const that = this;
var that = this;

...
  f: function (a, b, c) {
    ...
  }
...
  • 优点
  • (目前)比箭头函数稍快
  • 拥有自己的背景(即
    arguments
    等)
  • 可以在所有浏览器和环境中安全地实现
  • 缺点
  • 烦人的
    that
    (或其他一些变量名称)而不是
    this
  • 函数不能是外部的,否则会失去
    that
    参考

解决方案2:函数绑定(ES5)

...
  f: (function (a, b, c) {
    ...
  }).bind(this)
...
  • 优点
  • “正确”
    this
    可用
  • 可以传递任何外部函数引用(即重用代码)
  • 拥有自己的背景(即
    arguments
    等)
  • 缺点
  • (目前)比箭头函数稍慢
  • 如果之前绑定了函数引用,则会出现意外结果
  • 不支持 IE8 或许还有其他浏览器 (我不得不提这一点,即使我不太关心 IE8)

解决方案 3:解构赋值 (ES6)

...
  f: (...args) => {
    const [a, b, c] = args;

    ...
  }
  g: (a, b, c, ...others) => {
    ...
  }
...
  • 优点
  • 匿名函数
  • 无缝访问父上下文
  • 表现出类似的行为
  • 缺点
  • 签名没有告诉你它“应该”如何被调用
  • 可能需要解构
  • (目前)比标准函数稍慢
  • 不是真实的
    arguments
    实例
  • 需要一个转译器(例如:Babel)在浏览器中运行,这可能会转译为“遗留”实现

3
投票

您已经弄清楚了这一点,如果您使用箭头函数,扩展运算符 +

.length
将为您提供所需的信息。我认为您所呈现的特定用例(您需要保留参数信息并知道参数的长度)更适合非箭头函数:

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

如果您使用箭头函数来保留父上下文,则始终可以将

.bind(this)
添加到末尾(并且会产生较小的性能损失)。

我不知道你到底需要完成什么,但如果你不想编写一个未知数量的函数,也许默认参数可以让你处理用户忘记所需参数的情况? ...或者您可以将参数打包在一个对象中并使用

Object.keys
来确定长度:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.