我的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
。< / p>
一般来说,JavaScript函数是否与“常规”函数不同,其中参数的数量需要匹配?
在这种情况下,参数不匹配,但仍在调用函数。
答案 0 :(得分: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();
这是指定默认值的便捷方式。
答案 1 :(得分:3)
是的,您可以在不传递任何内容的情况下调用JavaScript函数。
JavaScript在某种意义上是独一无二的,因为它总是只是试图“工作”。所以你没有在第一次调用中定义一个参数,但它隐含地传递了那个奇怪的undefined
参数。查看有关undefined primitive type