Nodejs怎么自动生成函数名?
发布于 8 年前 作者 ShookABeta 5100 次浏览 来自 问答

先放代码:


function func1() {
    console.log('这是第一个函数');
}
function func2() {
    console.log('这是第二个函数');
}
function func3() {
    console.log('这是第三个函数');
}

function funcall(val) {
    switch (val) {
        case '1':
            func1();
            break;
        case '2':
            func2();
            break;
        case '3':
            func3();
            break;
        default:
            break;
    }
}
funcall('1');

怎么写funcall函数实现自动调用函数呢?传的值和函数是有关系的,比如值1对应func1,值2对应func2,目前我只会用switch方式来手工一一对应,数量比较少的时候还可以,但是如果对应的数量多了写起来就很烦,请教各位怎么改写funcall最简单?

15 回复
function funcall(val) {
  eval("func" + val + "()");
}

思路: 1.用数组做map,凭借数组的游标定位引用到的function。 2.定义一个父对象,在对象里定义function。

let funcArr=[
function() {
    console.log('这是第一个函数');
},
function() {
    console.log('这是第二个函数');
},
function() {
    console.log('这是第三个函数');
},
]

const val=1;
funcArr[val]();
let fatherObj={
"func1":function() {
    console.log('这是第一个函数');
},
"func2":function() {
    console.log('这是第二个函数');
},
"func3":function() {
    console.log('这是第三个函数');
}
}

const val="func1";
fatherObj[val]();

一楼也是个思路,但是eval有安全性风险,不建议用。 二楼和我思路类似,额外做了类型检测,推荐。

@libook 二楼不就是你自己么。。。

@xcatliu 刚才刷我前面还有一个,后来就没了,估计是删帖了?

不建议用eval 可以用下面的方式 将那些function 赋值 给一个数组

let func = [ 
	function(){
		console.log('func1');
	},  
	function(){
		console.log('func2');
	},  
];  

function funcall(val) {
	console.log('func:=', val);
	func[val]();                                                                                                                                    
}
funcall(0);
funcall(1);

Print 结果

func:= 0
func1
func:= 1
func2

我刚才写的,一个有问题我就删除了;这个是我测试过的;可以直接运行使用的; 我刚回复的,前面只有一个贴; 为了不误人子弟,我就测试验证了下

test = function (str){
	console.log(str);
}
global['test']('aaaaaaaaaaaaaaaaaaaaa');

默认全局的写法 test 前面不能加 var let 和const 这个写法的本质是2楼的第二种方式 对象的属性可以写成数组这种方式调用

非常感谢各位,让我学到好几个方法,我开始问得比较简单,没描述清楚,用数组的方式还解决不了我的问题,所以最后我采用了2楼第2个方法。@libook @liujavamail @slclub

@xcatliu 哈哈 笑死了

来自酷炫的 CNodeMD

不太清楚你的具体需求是什么,如果是想做structs2 这样的中控的话 可以用配置+模块, 如果是像 根据参数调用某个函数的话

const actions = {
  func1: () => { // 处理过程 },
  func2: () => { // 处理过程 },
  func3: () => { // 处理过程 },
  func4: () => { // 处理过程 },
  // ...
}
const mapAction = (actions, value) => {
	return actions[`func${value}`]
}
// 调用
mapAction(actions, 1)()

@dp199313 谢谢,我虽然已经用前面的办法解决了问题,不过又从你这儿学到些新东西!

其实。。以上的种种写法跟 switch 没有啥本质区别。。。无非就是怎样把 一个标识符与一个已有的 function 对应起来。 仅eval() 利用了 js的动态能力,稍稍不同。

为什么不用Reflection

function func1() {
    console.log('这是第一个函数');
}
function func2() {
    console.log('这是第二个函数');
}
function func3() {
    console.log('这是第三个函数');
}
Reflect.get(this,'func1')()

@myy 嗯,用eval()确实最简单,但是大家都说不是很安全,我才学的js,不太懂,所以听大家的,先不用这个; @jiangzhuo 又学到一个办法:)

回到顶部