2013-06-21 44 views
1

我想重写一个文件来合并公共和私有变量。我正在尝试这样做:调用嵌套在var中的私有函数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未定义”错误。我认为在PubObj之外移动getPrivFunc可以工作,但我遇到了同样的问题。调用PrivateFunc也会给出错误。我觉得这是一个愚蠢的错误,我只是没有看到它。

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

+0

* “我是 ”getPrivFunc是不确定*这是因为'PrivateFunc'是'未定义的“ 错误”。 '。你实际做的是把变量赋给自己('return PrivateFunc;')。这与'var foo = foo;'是一样的。但是因为'foo'('PrivateFunc')从来没有被赋予不同的值,所以它的值将是'undefined'。 –

回答

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 
    }; 
})(); 
+0

这是有道理的。我可以看到如何工作。我在猜测保持“PubObj”中的所有内容都可以工作吗?这是对现有文件的重写,并且在整个程序中多次调用“PubObj”。 或者它会像'var p = PubObj; p.publicFunc(PARAM);'? –

+0

刚更新了样本;这符合你的要求吗?现在定义它的方式,'PubObj'可以在“private”函数中和文件的全局范围内访问。 – dfreeman

+0

正是我想要的。谢谢 –

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( '测试'),我们得到:

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