你会使用“冒牌”吗?JavaScript中的函数重载

Do You Use "Fake" Function Overloading In JavaScript?

本文关键字:JavaScript 重载 函数 冒牌      更新时间:2023-09-26

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

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

我知道JavaScript并没有内置对重载函数的支持,但是有人围绕这个工作来实现重载函数功能吗?

我很好奇:

1)。对速度的影响

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

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

在javascript中有一种倾向,传递参数是对象的属性,即有一个参数是对象,因此你可以指定任何东西,以任何顺序。使用这种方法,您可以检查'undefined',并且您的函数可以根据。

如果你在不同的情况下有相当大的行为,你可以扩展这个想法,把每个情况分成一个单独的函数,然后由你的主'重载'函数调用。

例如:

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

您还可以根据参数的数量或实参的数量使用相同的方法。

JavaScript 不支持函数重载。虽然它允许你传递一个可变数量的参数。

您必须检查function内部传递了多少arguments以及它们的类型。

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

。,在JQuery中,on()方法有多个调用签名:

.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魔术变量的数组解构的简写,而不是将其视为固定的函数签名。

对速度的影响很小,甚至不需要考虑。

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