Способы защиты глобальной области видимости в Javascript - PullRequest
3 голосов
/ 09 января 2012

ОРИГИНАЛЬНЫЙ ВОПРОС:

Я изучаю js, и я хотел бы знать, есть ли какая-либо (полезная) разница между этими двумя способами защиты глобальной области видимости, кроме того факта, что второй может быть повторно использован (вызван снова).

option1:

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

option2:

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:

спасибо, Ланстон и Луисперезфд! я не осознавал, что question.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()();

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Нет разницы в приведенном вами примере, но есть разница, которой вы не воспользовались.В первом примере вы можете использовать переменные и не загрязнять глобальное пространство имен или пространство имен объекта.Эквивалент частного поля в большинстве объектно-ориентированных языков.Вы можете сделать это так:

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

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

Причина, по которой код выше возвращает undefined, заключается в том, что PrivateVariable не является полем в question.Но функции в 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 голосов
/ 09 января 2012

@ svdsvd, у liusperezphd и у вас совсем другое, PrivateVariable, вы не можете получить его в глобальном масштабе, но вы можете получить свой question.option3.privateVar в глобальном

...