据我所知,在大多数编程语言中,例如C#和java,这是常见的。方法或函数需要具有传递变量的参数。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(add(12,48));
Console.ReadKey();
}
static int add(int x, int y)
{
return x + y;
}
}
但是,如果我尝试使用参数调用此方法,我会收到错误。
add();
另一方面,如果我使用其他值调用此方法,我也会收到错误。
add(12,16,52);
当涉及到JavaScript时,它会有所不同。可以将变量传递给非参数化函数。
function add() {
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
sum += arguments[i];
}
return sum;
}
测试
> add(15,25,5,40)
15
25
5
40
< 85
我想知道,“这是一个优势吗?”或者“这是一种泄漏吗?”。
如果它有优势,那么为什么JavaScript函数中仍会添加参数?
如果是泄密,那么如何从这个泄漏中延伸我的JavaScript函数呢?
非常感谢你们所有人。
答案 0 :(得分:2)
绝对可以用作优势。
在JavaScript中,所有函数本身都是variadic,这意味着它们接受可变数量的参数。
您无法阻止这种情况发生。您可以做的是检查函数中的参数数量,以区分不同的调用。
在该语言的旧版本(ES2015之前版本)中,您必须使用arguments object进行此项检查。 参数对象隐式注入所有函数,行为类似于数组,但不是数组(这会阻止您使用数组方法)直接在arguments
)。请注意,现在使用arguments
通常不赞成,因为有更好的选择。
function a() {
console.log(arguments.length);
}
从ES2015及以上,您通常会使用rest parameters来检查传递的参数数量。一个很大的优点是休息参数实际上是真正的数组,并且它们是明确定义的。
由于它们是真实数组,因此您可以直接在其余参数上调用.map
等数组方法,这需要使用较早的arguments
方法进行更多工作。
function a(...args) {
console.log(args.length);
}
另一个有用的事情是Function.length
返回为函数指定的实际参数的数量。例如:
const three = (a, b, c) => {}
console.log(three.length); // 3
答案 1 :(得分:1)
arguments
对象存在于每个(遗留)函数中。这是设计的。即使给出了命名参数,空参数列表也不是错误的。该值仅为undefined
。
为保护您的功能,您可以检查长度并抛出错误。
function add() {
if (arguments.length > 0) {
throw new Error('got parameter, where no one expected')
}
console.log('add() called');
}
add();
add(0);
&#13;
答案 2 :(得分:1)
首先,Java和C#是静态类型语言,JavaScript是动态类型的 - 这是它们之间的根本区别,因此它的功能是“behaiour&be;是不同的。
在w3schools上,您可以阅读:
JavaScript函数有一个名为arguments对象的内置对象。
所以,当然,这不是泄密。