我发现在Javascript编码时ESLint非常有用,但我想知道为什么没有规则检查函数调用中正确数量的参数:
function myFunction(param1) {
}
...
myFunction(param1,param2);
未被检测到,但完全违反了合理的规则。 我想念一下吗?
答案 0 :(得分:3)
有人可以编写这样的规则,但有两个问题:
在所有情况下都无法使用静态分析来确定调用哪个函数,因此对于foo(1)
,ESLint可能会也可能无法告诉函数{{1} }指的。所以这样的规则充其量是不可靠的。考虑:
foo
ESLint应该抱怨吗?如何知道是function a() {
return 42;
}
function b(x) {
return x * 2;
}
var f = Math.random() < 0.5 ? a : b;
f();
还是a
?
因此,在没有引入类型系统的情况下,这样的规则是不可执行的,这允许我们将类型与引用函数的变量/属性相关联。当然,JavaScript没有类型化的变量/属性。 (如果您想要那种类型的安全性,可以使用TypeScript,它允许applying types to functions。)
在JavaScript中完全有效的方法是调用参数少于或多于正式参数的函数。一些函数被设计为以这种方式调用。您需要一种方法告诉ESLint这是您的意图(并且再次:ESLint可能不知道正在调用的函数)。
Re#2,在ES5及更早版本中,我们写了一个&#34; varargs&#34; (变量参数)函数使用b
和/或检查arguments
作为形式参数的值:
undefined
&#13;
因此,虽然可以编写一个ESLint工具,将对函数的调用与其声明的形式参数的数量进行比较,但规则不断正在运行异常。
但是现在ES2015引入了休息参数和参数默认值,有人可能会编写这样的规则,因为rest参数和参数默认值的组合使得我们更有可能在函数声明中清楚地表达我们的参数期望。这与ES2015的功能相同:
function foo(formal) {
// Supply a default for our formal parameter
if (formal === undefined) { // or you might see `if (arguments.length === 0)` here
formal = "default";
}
console.log("formal =", formal);
// Show any additional varargs we may handle
for (var i = 1; i < arguments.length; ++i) {
console.log("additional =", arguments[i]);
}
}
foo();
foo(1, 2, 3);
&#13;
请注意声明如何确实允许ESLint强制执行规则。但同样,请参阅#1:ESLint无法从静态分析中了解到可靠地调用了什么函数。
答案 1 :(得分:1)
这是合理但不必要的,因为在js中
function f(a){
console.log(arguments.length);//3
}
f(1,2,3);
你可以通过参数[1],参数[2]
获得其他增补 在es6中,我们可以通过......获得所有参数。function f(...args){
console.log(args.length);
}
然而,我们不能在es5或es3中这样做。当发生这种情况时,参数有效,因为某些函数可以接受很多参数,并且不能确定参数的数量。
例如,push(),concat()
实际上,如果发送的参数多于所需的参数,通常情况下,函数会忽略该参数。