【发布时间】: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...
【问题讨论】:
-
这段代码应该做什么?请不要只说“重载函数”——这已经是问题的一部分。我不明白如何。而且我不想尝试从代码中对解决方案进行逆向工程。因此,我无法猜测实际目标是什么。我也无法提供实现该目标的替代方案。
-
这个问题的基本答案是:不要。只需以通常的方式编写函数,也许使用默认参数值;或编写具有不同名称的多个函数。如果您确实需要,请接受一个休息参数并根据该参数的长度计算出要做什么。上面有一些问题:你没有声明变量,所以你隐式地创建了全局变量(例如:
createFunc),你创建的所有函数也是全局变量,这是不好的做法(全局命名空间已经太拥挤了) ,new Array()写得更好[], ... -
我将具有相同名称但不同上下文的函数添加到 Funcs 变量。 Funcs 有自己的范围,并从全局命名空间和全局范围中分离出来。只有一个全局函数可以从函数中调用其他同名函数。 (window[fname] = function() {...).