显然,arguments.length不起作用。
我可以将签名更改为f: (...args) => { if (args.length>0) { ..}; };
但是这会从函数声明中删除参数信息。
有更好的方法吗?
答案 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:
与函数表达式相比,箭头函数表达式具有更短的语法,并且词汇绑定此值(不绑定自己的
this
,arguments
,{{1} },或super
)。箭头功能始终是匿名的。这些函数表达式最适合非方法函数,不能用作构造函数。
箭头函数的主要用途是用于回调,以执行代码,就像它在其父上下文中执行一样。因此,可以防止令人烦恼和丑陋的new.target
要求并隐含地进行。
由于这个原因,并且由于它是匿名执行的,因此在父级的上下文中没有const that = this;
,或者更确切地说,值是父级的上下文。箭头函数只解决一般用例,而不是每个用例。
arguments
// const that = this;
var that = this;
...
f: function (a, b, c) {
...
}
...
等)。arguments
(或其他一些var名称)而不是that
。this
参考that
...
f: (function (a, b, c) {
...
}).bind(this)
...
可用this
等)。arguments
...
f: (...args) => {
const [a, b, c] = args;
...
}
...
实例