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

chy5wohz  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(98)

很明显,长度不起作用。
我可以把签名改成f: (...args) => { if (args.length>0) { ..}; };
但这会从函数声明中删除参数信息。
有更好的办法吗?

ldxq2e6h

ldxq2e6h1#

简短的回答是:“不”,或者“也许”。
较长的答案是:从MDN
与函数表达式相比,箭头函数表达式的语法更短,并且按词法绑定this值(不绑定其自身的thisargumentssupernew.target)。箭头函数始终是匿名的。这些函数表达式最适合于非方法函数,并且不能用作构造函数。
arrow函数的主要用途是回调,就像在父上下文中执行代码一样执行代码,从而避免了恼人的和丑陋的const that = this;需求,并隐式地执行了它。
因此,由于它是匿名执行的,在父函数的上下文中,不存在arguments,或者说它的值是父函数的上下文中的值。

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

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

...
  f: function (a, b, c) {
    ...
  }
...

字符串

*优点

  • (目前)比箭头函数稍快
  • 拥有自己的上下文(即arguments等)
  • 可以在所有浏览器和环境中安全地实现
  • 缺点:
  • 恼人的that(或其他一些var名称),而不是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),它可能会转换为一个“遗留”实现
xqk2d5yq

xqk2d5yq2#

你已经弄明白了,spread operator + .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 });


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

相关问题