JavaScript非参数化函数仍然可以获取参数

时间:2016-09-24 08:24:53

标签: javascript

据我所知,在大多数编程语言中,例如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函数呢?

非常感谢你们所有人。

3 个答案:

答案 0 :(得分:2)

绝对可以用作优势

在JavaScript中,所有函数本身都是variadic,这意味着它们接受可变数量的参数。

您无法阻止这种情况发生。您可以做的是检查函数中的参数数量,以区分不同的调用。

ES5

在该语言的旧版本(ES2015之前版本)中,您必须使用arguments object进行此项检查。 参数对象隐式注入所有函数,行为类似于数组,但不是数组(这会阻止您使用数组方法)直接在arguments)。请注意,现在使用arguments通常不赞成,因为有更好的选择。

function a() {
    console.log(arguments.length);
}

ES2015 +

从ES2015及以上,您通常会使用rest parameters来检查传递的参数数量。一个很大的优点是休息参数实际上是真正的数组,并且它们是明确定义的。

由于它们是真实数组,因此您可以直接在其余参数上调用.map等数组方法,这需要使用较早的arguments方法进行更多工作。

function a(...args) {
    console.log(args.length);
}

Function.length

另一个有用的事情是Function.length返回为函数指定的实际参数的数量。例如:

const three = (a, b, c) => {}
console.log(three.length); // 3

答案 1 :(得分:1)

arguments对象存在于每个(遗留)函数中。这是设计的。即使给出了命名参数,空参数列表也不是错误的。该值仅为undefined

为保护您的功能,您可以检查长度并抛出错误。

&#13;
&#13;
function add() {
    if (arguments.length > 0) {
        throw new Error('got parameter, where no one expected')
    }
    console.log('add() called');
}

add();
add(0);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

首先,Java和C#是静态类型语言,JavaScript是动态类型的 - 这是它们之间的根本区别,因此它的功能是“behaiour&be;是不同的。

w3schools上,您可以阅读:

  

JavaScript函数有一个名为arguments对象的内置对象。

所以,当然,这不是泄密。