调用嵌套在var Javascript中的私有函数

时间:2013-06-21 19:08:03

标签: javascript

我想重写一个文件以合并公共和私有变量。我正在尝试这样做:

var PrivateFunc = (function() {

  //Private Functions
  var _iAmPrivate = function(param, args){
    //code
  }

  var _soAmI = function(param){
    //code
  }

  return PrivateFunc;
})();

var PubObj = {
  someVar: 1,
  getPrivFunc: PrivateFunc,

  publicFunc: function(param){
    //This doesnt work
    this.getPrivFunc._iAmPrivate(someVar, param);
    //This doesn't either
    getPrivFunc._soAmI(param);
  }

};

我是“getPrivFunc未定义”错误。我认为在getPrivFunc之外移动PubObj可以起作用,但我遇到了同样的问题。调用PrivateFunc也会出错。我觉得这是一个愚蠢的错误,我只是没有看到它。

也许有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

使用var声明的任何内容在声明的函数之外将无法访问。您可以执行类似以下操作的操作。需要记住的重要一点是 你的var出现在哪里定义了他们的声明范围。

var PubObj;
(function() {
  PubObj = {
    someVar: 1,

    publicFunc: function(param) {
      _iAmPrivate(this.someVar, param);
      _soAmI(param);
    }
  };

  //Inner Functions
  var _iAmPrivate = function(param, args) {
    //code
  };

  var _soAmI = function(param) {
    //code
  };
})();

答案 1 :(得分:1)

您的PrivateFunc没有返回任何内容,因为您在没有正确实现的情况下使用OOP概念。如果我们为每个私有函数创建一个为this设置属性的函数,则可以使用new关键字创建一个实例。

var PrivateFunc = new function() {
  this._iAmPrivate = function(param, args) {
    console.log('PrivateFunc._iAmPrivate called with', param, args);
  }

  this._soAmI = function(param) {
    console.log('PrivateFunc._soAmI called with', param);
  }
}();

然后我们可以从您的PubObj内部访问PrivateFunc。

var PubObj = {
  someVar: 1,
  getPrivFunc: PrivateFunc,

  publicFunc: function(param) {
    this.getPrivFunc._iAmPrivate(this.someVar, param);
    this.getPrivFunc._soAmI(param);
  }
};

当我们调用PubObj.publicFunc('test')时,我们得到:

PubObj.publicFunc('test')
> PrivateFunc._iAmPrivate called with 1 test
> PrivateFunc._soAmI called with test