JavaScript函数使用不同的参数执行

3

我的HTML代码中有一个按钮,它运行一个函数,并调用其他几个JavaScript函数。代码如下:

<button id="ButtonSearch" onclick="FillAll()"></button>

FillAll()函数位于Calls.js文件中,代码如下:

function FillAll()
{
    var from_date = document.getElementById('FromDate').value;
    var to_date = document.getElementById('ToDate').value;

    FillMap();
    FillMap(from_date, to_date);
    FillRadio();
    FillArea();
}

最后,实际的函数FillMap()在文件Maps.js中,看起来像这样:

function FillMap(from_date, to_date)
{   
    alert(from_date);
    var from_date = document.getElementById('FromDate').value;
    var to_date = document.getElementById('ToDate').value;
    // do stuff
}

奇怪的是,FillMap()被调用了两次,而且alert弹出框也出现了两次:第一个是undefined,而第二个则显示了from_date
一般来说,JavaScript函数和“常规”函数有所不同,需要匹配参数的数量吗?
在这种情况下,虽然参数不匹配,但函数仍然被调用。

2
@PredatorIWD 请不要使用 void(0)。虽然它可以工作,但这是一种古老的技术。更好的选择是直接传递 null 作为参数值。 - Scott Marcus
JavaScript没有重载。在同一作用域中,您只能有一个具有相同名称的函数/变量。将另一个函数分配给该名称将替换先前的函数,而不是创建重载。在JS中,所有参数都是可选的,您可以传递比方法签名更多或更少的参数,它不会抱怨。 - Jonathan
2个回答

8

你的代码中有两个调用,所以它被调用了两次:

FillMap();
FillMap(from_date, to_date);

对于你提出的主要问题,在JavaScript中,所有参数基本上都是可选的。除非另有规定,否则它们默认为undefined

function A(a, b, c) {
    console.log(a, b, c);
}

A(1, 2);

像Java和C#这样的强类型语言会在编译时抛出错误,不允许你这样做。

JavaScript则不关心,并且任由你随意调用它。

使用ECMAScript 6,现在可以直接指定默认值:

function A(a = 5) {
    console.log(a);
}

A();

在此之前(甚至是现在的转换代码中),您经常会看到以下模式:

function A(a) {
    a = a || 5;
    console.log(a);
}

A();

这是一种方便指定默认值的方式。


3

是的,你可以调用一个JavaScript函数而不传递任何参数。

JavaScript独特的地方在于它总是试图“工作”,所以在第一次调用时没有定义参数,但它隐式地传递了奇怪的undefined参数。了解更多关于undefined原始类型的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接