【问题标题】:Do You Use "Fake" Function Overloading In JavaScript? [duplicate]你在 JavaScript 中使用“假”函数重载吗? [复制]
【发布时间】:2013-03-21 03:33:05
【问题描述】:

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

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

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

我很好奇:

1.) 对速度的影响

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

您似乎可以检查参数是否未定义并“伪造”JavaScript 中的功能。对我来说,仅通过更改参数数量来轻松更改功能将是一个很大的优势。

【问题讨论】:

标签: c# javascript performance


【解决方案1】:

在 javascript 中,传递参数的趋势是对象的属性,即有一个参数是对象,因此您可以按任何顺序指定任何内容。使用这种方法,您可以检查“未定义”,并且您的函数可以按照该方法运行。

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

例如:

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

您也可以根据数量参数或争论的数量使用相同的方法。您可以阅读有关使用参数here 的信息。

【讨论】:

  • 这并不能回答 OP 关于速度问题的问题。你能补充一下吗?
【解决方案2】:

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

你必须检查function里面有多少arguments被传递了,它们的类型是什么。

【讨论】:

  • 是的,我意识到没有内置支持,想知道用户是否通过变通方法扩展 JS 功能以自行实现这一点,以及这样做的原因可能是什么。
【解决方案3】:

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

例如,在 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 magic variable 数组解构的简写,而不是固定的函数签名。

对速度的影响微乎其微,甚至都不是考虑因素。

至于何时执行此操作与何时使用单独的函数,这完全是程序清晰度和可用性问题,可能需要广泛的意见。

【讨论】:

  • 令人难以置信的答案弗朗西斯。我对静态类型语言的接触有限,所以我不知道实际上将函数归类为“重载”的原因是这些函数如何运行的一般前提。经过更多研究,我同意我犯了一个类别混淆错误,因为我肯定是在考虑固定函数签名。谢谢,你就是那个男人。
猜你喜欢
  • 2011-04-28
  • 2011-09-22
  • 2011-03-14
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2016-11-30
相关资源
最近更新 更多