Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于JS函数和参数的帮助_Javascript - Fatal编程技术网

Javascript 关于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个参数的版本,然后检查第三个参数是否===未定义,并在此基础上提供不同的行为。不,这将不起作用,您的页面上将只定义第

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个参数的版本,然后检查第三个参数是否
===未定义
,并在此基础上提供不同的行为。

不,这将不起作用,您的页面上将只定义第二个函数。”这是一个来源。

不,你不能那样做。。。除非您同意只保留上一个定义。

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
    }

}