你在 JavaScript 中使用“假”函数重载吗? [复制]
Posted
技术标签:
【中文标题】你在 JavaScript 中使用“假”函数重载吗? [复制]【英文标题】:Do You Use "Fake" Function Overloading In JavaScript? [duplicate] 【发布时间】: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 中的功能。对我来说,仅通过更改参数数量来轻松更改功能将是一个很大的优势。
【问题讨论】:
JavaScript 不能重载函数 - 它们是 variadic。然而,您可以使用这个更强大的概念来模拟重载函数;另见method overloading in Javascript 【参考方案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 数组解构的简写,而不是固定的函数签名。
对速度的影响微乎其微,甚至都不是考虑因素。
至于何时执行此操作与何时使用单独的函数,这完全是程序清晰度和可用性问题,可能需要广泛的意见。
【讨论】:
令人难以置信的答案弗朗西斯。我对静态类型语言的接触有限,所以我不知道实际上将函数归类为“重载”的原因是这些函数如何运行的一般前提。经过更多研究,我同意我犯了一个类别混淆错误,因为我肯定是在考虑固定函数签名。谢谢,你就是那个男人。以上是关于你在 JavaScript 中使用“假”函数重载吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章