关于c#:你在JavaScript中使用“假”函数重载吗?

Do You Use “Fake” Function Overloading In JavaScript?

本问题已经有最佳答案,请猛点这里访问。

在C中,我可能有一个这样的重载函数:

1
2
public string OverLoad(string str1)                  {return str1;}
public string OverLoad(string str1, string str2)     {return str1+str2;}

我知道javascript没有内置的对重载函数的支持,但是是否有人能解决这个问题来实现重载函数功能?

我很好奇:

1.)对速度的影响

2.)使用不同函数名与重载的原因

您似乎可以检查参数是否未定义,并在javascript中"伪造"该功能。对我来说,只通过改变参数数量就可以轻松地改变函数,这将是一个很大的优势。


在JavaScript中,传递参数的趋势是对象的属性,即有一个参数是对象,因此可以以任何顺序指定任何内容。使用这种方法,您可以检查"undefined"是否存在,并且您的函数的行为可以根据。

如果您在不同的情况下有相当大的行为,您可以通过将每个情况拆分成一个单独的函数来扩展这个想法,然后由您的主"重载"函数调用该函数。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
function a (params) {
    // do for a
}
function b () {
    // do for b
}
function main (obj) {
    if (typeof obj.someparam != 'undefined') {
        a(whatever-params);
    } else if (typeof obj.someotherparam != 'undefined') {
        b(whatever-params);
    }
}

您也可以基于数字参数或参数数量使用相同的方法。您可以在这里阅读关于使用参数的信息。


这是很常见的,甚至没有人注意到。

例如,在jquery中,on()方法有多个调用签名:

1
2
.on( events [, selector ] [, data ], handler(eventObject) )
.on( events [, selector ] [, data ] )

对第一个窗体的调用类似于$('sel').on('click', function(e){/*handler*/})。对第二个窗体的调用类似于$('sel').on({click: function(e){/*click handler*/}, mouseover: function(e){/*mouseover handler*/})。注意,这演示了Java/C术语中的"多态"(即不同类型的参数)和"重载"(即可选参数)。

关键字参数(使用单个对象参数模拟)也很常见,例如$.ajax({settings})

所以是的,这在所有地方都是这样做的,但是您将其称为"过载"是一种类别混淆。JS既不是静态类型的,它的函数也没有固定数量的函数参数。在调用时,您可以根据需要提供任意多个或任意少的参数,而不管函数声明了什么。您应该将函数声明中的参数列表作为arguments幻数变量数组破坏的简写,而不是作为固定函数签名。

对速度的影响是如此之小以至于根本不需要考虑。

至于什么时候做,什么时候使用一个单独的功能,这完全是一个程序的清晰性和可用性问题,可能会受到广泛的意见。


JavaScript不支持函数重载。尽管它允许您传递一个可变数量的参数。

你必须在function内部检查有多少arguments通过,它们的类型是什么。