2012-01-09 70 views
2

原題:方式來保護全球範圍內的Javascript

我學習JS,我想知道是否有保護比其他全球範圍內的這兩種方式之間的任何(有用的)差異事實上第二個可以重用(再次調用)。

選項1:

var question = {}; 
(function(){ 
    question.option1 = function() { 
     // some code 
    }; 
})(); 

選項2:

var question = {}; 
question.option2 = function() { 
    //some code 
}; 
question.option(); 

的感謝!

編輯1:

謝謝@luisperezphd。你寫的和這個(除了冗長)之間有什麼區別嗎?

var question = {}; 
question.option3 = {}; 
question.option3.privateVar = 0; 
question.option3.testing = function() { 
    question.option3.privateVar++; 
    // some code 
}; 
question.option3.testing(); 

編輯2:

謝謝lanston和luisperezphd!我沒有意識到這個問題.option3.privateVar在全球範圍內可用。

有此之間的任何差別:與

var question = {}; 
(function(){ 
    var privateVar = "some value"; 
    question.option4 = function(){ 
     alert(privateVar); 
    } 
})(); 
question.option4(); 

這樣的:

var question = {}; 
question.option5 = function() { 
    var privateVar = "some value"; 
    var someFunction = function() { 
     alert(privateVar); 
    } 
    return someFunction; 
} 
question.option5()(); 

+0

他們的行爲是一樣的,我相信第二個被稱爲封閉。但是在這兩種情況下,privateVar都不能在函數之外訪問。 – 2012-01-10 05:43:44

回答

4

你給的例子沒有什麼區別,但是你還沒有發現一個區別。在第一個示例中,您可以利用變量而不會污染全局名稱空間或對象名稱空間。在大多數面嚮對象語言中相當於一個私人領域。你會做到這一點,像這樣:

var question = {}; 
(function(){ 
    var PrivateVariable = 0; 
    question.option1 = function() { 
     PrivateVariable++; 
     // some code 
    }; 
})(); 

alert(question.PrivateVariable); // returns 'undefined' 

上面的代碼返回undefined的原因是因爲PrivateVariablequestion的字段。但question中的函數可以訪問PrivateVariable。這是一個真正的私人變量。

另一方面有,如果你寫的是這樣的:

var question = {}; 
question.PrivateVariable = 0; 
question.option1 = function() { 
    question.PrivateVariable++; 
    // some code 
}; 

alert(question.PrivateVariable); // returns 0 

在第二種情況下PrivateVariable其實不是私人和公開訪問。

順便說一句,您通常不會從屬於您問題的函數內引用question。相反,你應該使用this關鍵字,像這樣:

var question = {}; 
question.PrivateVariable = 0; 
question.option1 = function() { 
    this.PrivateVariable++; 
    // some code 
}; 

但這隻會對公共變量的工作。這使得它更清楚發生了什麼。在某些情況下,如果您更改question的變量名稱,則可以更輕鬆地維護代碼,因此您不必在該函數內更改對其的引用。還有其他好處,但我不知道我是否應該在這裏進入。

如果這回答你的問題,請接受它作爲答案。

謝謝。

+0

謝謝!請參閱上面的澄清問題。 – svdsvd 2012-01-09 07:28:31

+0

我更新了我的答案,以根據您的澄清更直接地回答您的問題。 – 2012-01-09 21:38:26

+0

謝謝。我們到了那裏。我並沒有問正確的問題來找出我需要知道的東西 - 對不起!看第二個編輯。 – svdsvd 2012-01-10 03:38:15

0

@ svdsvd,這是liusperezphd的,也是你的PrivateVariable之間完全不同,你不能把它在全球性的,但你可以得到你的question.option3.privateVar在全球

+0

謝謝!起初我沒有意識到這一點。我在探索在命名空間內創建私有變量的不同方式之後。我再次轉述了我的問題...... – svdsvd 2012-01-10 03:41:09