【问题标题】:Accessing private methods of a JS Function访问 JS 函数的私有方法
【发布时间】:2015-10-12 11:10:03
【问题描述】:

我有以下 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

【问题讨论】:

标签: javascript function constructor javascript-objects


【解决方案1】:

在这种情况下,最好将您的内部函数存储在对象中,这样您就可以使用变量名轻松访问它。所以如果你定义一个函数“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'}) );

【讨论】:

    【解决方案2】:

    当您传递lol.func({fName: add}) 时,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-01
      • 2017-01-19
      • 2017-07-13
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多