function man(){
function add(a,b){
return a+b;
}
function sub(a,b){
return a-b;
}
function pow(a){
return a**a;
}
}
man('pow',2);
有没有办法可以通过电话“man('pow',2)调用电源功能”.. ??? ???
答案 0 :(得分:2)
没有。这是隐藏JS中信息/实现的关键方法之一 - inside a closure。没有任何方法可以访问未暴露给外部的值。
也许您正在寻找对象:
var man = {
add(a,b) {
return a+b;
},
sub(a,b) {
return a-b;
},
pow(a) {
return a**a;
}
};
console.log(man.pow(2));
答案 1 :(得分:2)
如果您的功能在全球范围内,那么不仅仅是
window[functionName](a, b);
但是因为它们在你的私人范围内,我建议将它们添加到某个数组中,而不是称之为:
function man(func, arg1, arg2) {
var functions = {
add: function (a, b){
return a+b;
},
sub: function(a, b){
return a-b;
},
pow: function (a){
return Math.pow(a, a);
}
};
functions[func](arg1, arg2);
}
请注意,**
仅适用于ES7
答案 2 :(得分:1)
如果存储映射到键的每个函数,则可以通过其键调用该函数:
function man() {
var funcs = {
add: function(a, b) {
return a + b;
},
sub: function(a, b) {
return a - b;
},
pow: function(a) {
return a ** a;
}
};
return funcs[arguments[0]].apply(this, Array.prototype.slice.call(arguments, 1));
}
console.log('pow of 2 = ' + man('pow', 2));
console.log('add 2 and 6 = ' + man('add', 2, 6));
console.log('sub 2 from 8 = ' + man('sub', 8, 2));

apply
允许您将参数(类似数组)转换为相当于一堆参数。
Array.prototype.slice.call
允许您将参数转换为实际数组,以便您可以跳过第一个(用于标识要调用的函数)。
答案 3 :(得分:1)
您可以使用对象作为函数的引用。
function man() {
function add(a, b) { return a + b; }
function sub(a, b) { return a - b; }
function pow(a) { return a ** a; }
return { add, sub, pow }[arguments[0]](...[].slice.call(arguments, 1));
}
console.log(man('pow', 2));
console.log(man('add', 4, 5));

答案 4 :(得分:1)
嗯,使用eval不是个好主意。但是,这将起作用
function man(funName, a, b){
function add(a,b){
return a+b;
}
function sub(a,b){
return a-b;
}
function pow(a){
return a**a;
}
return (eval(funName))(a, b)
}
man('pow',2);
答案 5 :(得分:0)
您可以使用Javascript Closures来实现您需要的内容。