我可以在不使用函数名称的情况下在另一个函数内调用函数吗?

时间:2017-03-08 07:58:15

标签: javascript

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)调用电源功能”.. ??? ???

6 个答案:

答案 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来实现您需要的内容。