访问 JS 函数的私有方法

Accessing private methods of a JS Function

我有以下 javascript 代码

function MyFunc () {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
         return "Hello from div";
    };

    var funcCall =  function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }
      return obj.fName();


    };

  return {
    func: function (obj) {
      funcCall(obj);
    }
  };

}

var lol = new MyFunc();

当传递 lol.func({fName: add}); 时,它应该调用函数私有函数 add,或者当传递 lol.func({fName: div}); 时,它应该调用私有函数 div。我尝试过的方法不起作用。我怎样才能做到这一点。

DEMO

在这种情况下,最好将内部函数存储在对象中,这样您就可以轻松地使用变量名访问它。所以如果你定义一个函数 "map"

var methods = {
    add: add,
    div: div
};

你可以用methods[obj.fName]();调用它。

完整代码:

function MyFunc() {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
        return "Hello from div";
    };

    var methods = {
        add: add,
        div: div
    };

    var funcCall = function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }

        return methods[obj.fName]();
    };

    return {
        func: function (obj) {
            return funcCall(obj);
        }
    };

}

var lol = new MyFunc();
console.log( lol.func({fName: 'add'}) );

当您通过 lol.func({fName: add}) 添加时,将在评估此代码的范围内解析,而不是在 MyFunc 的范围内解析。您必须在该范围内定义它,例如:

function MyFunc () {

    var add = function () {
        return "Hello from add";
    };

    var div = function () {
         return "Hello from div";
    };

    var funcCall =  function (obj) {

        if (!obj) {
            throw new Error("no Objects are passed");
        }
      return obj.fName();


    };

  return {
    add: add,
    div: div,
    func: function (obj) {
      funcCall(obj);
    }
  };

}
var lol = new MyFunc();
lol.func({fName: lol.add});

或使用eval.