当调用Javascript函数时,似乎JS优先考虑没有参数的函数,即使我有与参数相同的函数名。 奇怪的行为只发生在以下场景中:
我有一个带有嵌入式Javascript的HTML页面,如下所示:
//Javascript in the page
function testAbc(){
alert('testAbc no params');
}
//Javascript in common.js
function testAbc(x){
alert('testAbc with param:'+x);
}
function testAbcFunc(x){
testAbc(x);
}
现在从页面的某个地方,我从common.js调用testAbcFunc
,期望它使用参数(即常用函数)调用testAbc
。但奇怪的是,JS在没有参数的情况下回调原始页面中的函数!!
我已经在几个小时前调试了这个bug,我尝试了这个简短的代码来重现这个bug,每次都会发生。
注意:如果所有函数都在同一页面中,则会调用正确的函数(带参数),但是当它们在页面和JS文件之间分开时。 JS似乎优先考虑页面中的功能,即使它没有参数
答案 0 :(得分:5)
JavaScript不支持基于参数的方法重载。如果多个函数具有相同的名称,它只使用最后定义的函数。页面中的版本将覆盖包含的版本。当它适合你时,我假设包含版本(带参数签名)在原始文件之后被内联。
答案 1 :(得分:4)
JavaScript没有重载功能。它不关心签名,它只通过名称而不是其他任何东西来调用函数。奇怪的是,后来的功能并没有完全隐藏第一个功能,但是没有关于这种行为的规范。
所以,不要这样做,检查函数内部arguments.length
的参数数量,不要尝试使用永远不会工作的重载。
function testAbc(){
if (arguments.length == 0) {
alert('testAbc no params');
} else {
var x = arguments[0];
alert('testAbc with param:'+x);
}
}
答案 2 :(得分:1)
JavaScript中没有函数重载。如果使用不同数量的参数定义两次函数,则将调用最后一个要定义的函数。
此外,您应该为JavaScript命名空间。
像这样:
var common = {
testABC: function () {
//Stuff
}
};
然后像这样调用testABC
common.testABC();