先放代码:
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最简单?
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
不太清楚你的具体需求是什么,如果是想做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 又学到一个办法:)