Javascript函数重载的最佳和快速方法
Posted
技术标签:
【中文标题】Javascript函数重载的最佳和快速方法【英文标题】:Javascript best & fast way for function overloading 【发布时间】:2021-12-28 04:24:08 【问题描述】:我编写了以下代码用于在 javascript 中重载函数。 此代码在大型项目上运行缓慢。 还有其他方法可以在 Javascript 中实现重载函数吗? 还有其他更快更实用的方法吗?
(() =>
//array that store functions
var Funcs = []
/**
* @param function f overload function
* @param string fname overload function name
* @param parameters vtypes function parameters type descriptor (number,string,object....etc
*/
overloadFunction = function(f, fname, ...vtypes)
var k,l, n = false;
if (!Funcs.hasOwnProperty(fname)) Funcs[fname] = [];
Funcs[fname].push([f, vtypes?vtypes: 0 ]);
window[fname] = function()
for (k = 0; k < Funcs[fname].length; k++)
if (arguments.length == Funcs[fname][k][0].length)
n=true;
if (Funcs[fname][k][1]!=0)
for(i=0;i<arguments.length;i++)
if(typeof arguments[i]!=Funcs[fname][k][1][i])
n=false;
if(n) return Funcs[fname][k][0].apply(this, arguments);
)();
//First sum function definition with parameter type descriptors
overloadFunction((a,b)=>return a+b,"sum","number","number")
//Second sum function definition with parameter with parameter type descriptors
overloadFunction((a,b)=>return a+" "+b,"sum","string","string")
//Third sum function definition (not need parameter type descriptors,because no other functions with the same number of parameters
overloadFunction((a,b,c)=>return a+b+c,"sum")
//call first function
console.log(sum(4,2));//return 6
//call second function
console.log(sum("4","2"));//return "4 2"
//call third function
console.log(sum(3,2,5));//return 10
//ETC...
【问题讨论】:
这段代码应该做什么?请不要只说“重载函数”——这已经是问题的一部分。我不明白如何。而且我不想尝试从代码中对解决方案进行逆向工程。因此,我无法猜测实际目标是什么。我也无法提供实现该目标的替代方案。 这能回答你的问题吗? Function overloading in Javascript - Best practices 这个问题的基本答案是:不要。只需以通常的方式编写函数,也许使用默认参数值;或编写具有不同名称的多个函数。如果您确实需要,请接受一个休息参数并根据该参数的长度计算出要做什么。上面有一些问题:你没有声明变量,所以你隐式地创建了全局变量(例如:createFunc
),你创建的所有函数也是全局变量,这是不好的做法(全局命名空间已经太拥挤了) , new Array()
写得更好[]
, ...
我将具有相同名称但不同上下文的函数添加到 Funcs 变量。 Funcs 有自己的范围,并从全局命名空间和全局范围中分离出来。只有一个全局函数可以从函数中调用其他同名函数。 (window[fname] = function() ...).
【参考方案1】:
重载的概念是为了避免使用无限参数的函数。这与你的模式相反。理想情况下,一个函数应该有几个参数。重载函数在重载参数中传递不同的参数。
function overload(fname, arr=[])
let sum = 0;
for(let i=0; i<arr.length; i++)
sum += arr[i];
return fname + sum;
overload("Juan", [1]);
因此, arr 不被视为重载,它的长度不确定。但是如果你有 obj 而不是 arr,你可以不加选择地传递任意数量的类型或值。
function overload(fname, obj=)
if(obj.arr)
if(obj.f)
overload("Juan", "arr":[1], "f":true, "infinite":-Infinity);
此重载参数非常适合范围或来源可疑的数据。
【讨论】:
以上是关于Javascript函数重载的最佳和快速方法的主要内容,如果未能解决你的问题,请参考以下文章