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

kof*_*fus 7 javascript ecmascript-6

很明显,arguments.length不起作用.

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

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

有更好的方法吗?

Yan*_*hon 5

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

\n

更长的答案是:来自MDN

\n
\n

与函数表达式相比,箭头函数表达式的语法更短,并且在词法上绑定 this 值(不绑定它自己的thisargumentssupernew.target)。箭头函数始终是匿名的。这些函数表达式最适合非方法函数,并且不能用作构造函数。

\n
\n

箭头函数的主要用途是回调,执行代码就像在其父上下文中执行一样。从而防止恼人的和丑陋的const that = this;要求并隐式地执行它。

\n

由于这个原因,并且由于它是匿名执行的,因此在父级上下文中,不存在arguments,或者更确切地说,该值是父级上下文的。箭头函数只能解决一般用例,而不是所有用例。

\n
\n

解决方案 1:遗留或“na\xc3\xafve”实施

\n
// const that = this;\nvar that = this;\n\n...\n  f: function (a, b, c) {\n    ...\n  }\n...\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 优点
  • \n
  • (目前)比箭头函数稍快
  • \n
  • 拥有自己的上下文(即arguments,等等)
  • \n
  • 可以在所有浏览器和环境中安全地实现
  • \n
  • 缺点
  • \n
  • 烦人的that(或其他一些变量名称)而不是this.
  • \n
  • 函数不能是外部的,否则会丢失that引用
  • \n
\n
\n

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

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

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

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