帮助JS和函数参数

时间:2010-02-02 21:00:16

标签: 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函数吗?

6 个答案:

答案 0 :(得分:34)

JavaScript不支持您在其他语言方法重载中调用的内容,但有多种解决方法(如使用arguments对象)来检查函数有多少个参数被调用:

function f1(a, b, c) {
  if (arguments.length == 2) {
    // f1 called with two arguments
  } else if (arguments.length == 3) {
    // f1 called with three arguments
  }
}

此外,您可以键入 - 检查您的参数,对于Number和String 原语可以安全地使用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语言功能,如闭包,函数应用程序等,来模仿方法重载

答案 1 :(得分:7)

不,你不能在JS中使用函数重载。

但是,您可以只声明具有3个参数的版本,然后检查第三个参数=== undefined,并在此基础上提供差异化​​行为。

答案 2 :(得分:3)

不,这不起作用,只会在您的页面上定义第二个功能。 Here是一个来源。

答案 3 :(得分:2)

Javascript仅使用最后定义的函数。

http://weblogs.asp.net/jgalloway/archive/2005/10/02/426345.asp X

您需要在函数内部实现自己的逻辑,以确定传入了哪些参数。

答案 4 :(得分:1)

不,你不能这样做......除非你只能保留你的最后一个定义。

答案 5 :(得分:0)

您也可以使用instanceof,例如基本多态。

首先创建一个超类(球)

// superclass
function Ball() {
    this.play = function() {
        alert("Ball throw");
    };
}

现在对于某些子类(球的类型)

// 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");
    };
}

给他们Ball功能,也就是通过原型设置他们的超类

// 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
    }

}

如果aBall是篮球,那么aBall = new Basketball();那么aBall instanceof Basketball将为篮球返回true而对于棒球则为false,但对于Ball来说是真的。

所以aBall instanceof Ball会返回true,因为篮球是一个球。

See code live at http://jsfiddle.net/kLCPB/