Javascript 关于JS函数和参数的帮助
JS是否支持两个名称相同、参数不同的函数Javascript 关于JS函数和参数的帮助,javascript,Javascript,JS是否支持两个名称相同、参数不同的函数 function f1(a, b) { // a and b are numbers } function f1(a, b, c) { // a is a string //b and c are numbers } 我可以在IE7、FF、Opera中使用这些JS函数吗?没有问题。不,你不能在JS中使用函数重载 但是,您可以只声明具有3个参数的版本,然后检查第三个参数是否===未定义,并在此基础上提供不同的行为。不,这将不起作用,您的页面上将只定义第
function f1(a, b)
{
// a and b are numbers
}
function f1(a, b, c)
{
// a is a string
//b and c are numbers
}
我可以在IE7、FF、Opera中使用这些JS函数吗?没有问题。不,你不能在JS中使用函数重载
但是,您可以只声明具有3个参数的版本,然后检查第三个参数是否
===未定义,并在此基础上提供不同的行为。不,这将不起作用,您的页面上将只定义第二个函数。”这是一个来源。不,你不能那样做。。。除非您同意只保留上一个定义。Javascript只使用上一个定义的函数
x
您需要在函数内部实现自己的逻辑,以确定传入了哪些参数。JavaScript不支持在其他语言中调用的方法重载,但有多种解决方法,例如使用对象来检查函数调用了多少个参数:
function f1(a, b, c) {
if (arguments.length == 2) {
// f1 called with two arguments
} else if (arguments.length == 3) {
// f1 called with three arguments
}
}
此外,您还可以键入检查参数,因为数字和字符串原语可以安全地使用typeof
运算符:
function f1(a, b, c) {
if (typeof a == 'number' && typeof b == 'number') {
// a and b are numbers
} else if (typeof a == 'string' && typeof b == 'number' &&
typeof c == 'number') {
// a is a string, b and c are numbers
}
}
还有更为复杂的技术,如本文中的技术,它利用一些JavaScript语言特性(如闭包、函数应用程序等)来模拟方法重载:
您还可以使用instanceof,例如基本多态性
首先创建一个超类(ball)
现在是一些子类(球的类型)
给他们球的功能,也就是通过原型设置他们的超类
// set subclass functionality
Basketball.prototype = new Ball();
Soccerball.prototype = new Ball();
Baseball.prototype = new Ball();
一些多态性(创建一堆球并与它们一起玩,但根据类型玩)
如果aBall是篮球,那么aBall=new Basketball()
然后aBall instanceof Basketball
将为Basketball返回true,为Basketball返回false,但为Ball返回true
所以aBall instanceof Ball
将返回true,因为篮球就是一个球
如果调用方传递了第三个参数,但其值未定义,则此测试将失败。如果函数改为测试arguments.length可能更好。如果调用方使用undefined
作为第三个参数,我会以此表示他们希望函数被视为只传入了两个。我真的看不出传递未定义的还有什么合法的目的。
// subclass
function Basketball() {
this.play = function() {
alert("basketball throw");
};
}
// subclass
function Soccerball() {
this.play = function() {
alert("soccer ball kick/throw");
console.debug("here");
};
}
// subclass
function Baseball() {
this.play = function() {
alert("strike 3 you're out");
console.debug("here");
};
}
// set subclass functionality
Basketball.prototype = new Ball();
Soccerball.prototype = new Ball();
Baseball.prototype = new Ball();
var bunchOfBalls = [new Baseball(), new Soccerball(), new Basketball()];
for (var i = 0; i < bunchOfBalls.length; i++) {
bunchOfBalls[i].play();
}
//overloading dependent upon type
function BasketbalOrBaseballOnlyPlay(aBall) {
if (aBall instanceof Basketball) {
//special basketball function
}
if (aBall instanceof Baseball) {
//special baseball function
}
}