2013-06-21 42 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