Преимущества анонимной функции JavaScript с пространствами имен - PullRequest
6 голосов
/ 18 ноября 2011

Есть ли какая-то выгода при написании классов JavaScript и пространств имен этого ...

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

(function(){
MyNamespace.MyClass = function(){
    this.property = 'foo'

    return this;
}
}());

По сравнению только с этим ...

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

MyNamespace.MyClass = function(){
    this.property = 'foo'

    return this;
}

Я видел первый шаблон, реализованный в нескольких библиотеках, и пытался выяснить, есть ли какое-либо дополнительное преимущество, если в первом примере не было объявлено какой-либо другой функции внутри анонимной функции.

Ответы [ 4 ]

11 голосов
/ 18 ноября 2011

На ваш вопрос:

Да, есть разница (и выгода). В первом примере вы можете управлять контролем доступа (то есть, используя основанную на прототипе версию открытых и закрытых переменных и функций-членов). Как пример:

var m = (function() {
    var o = {};
    o.myPublicProperty = 0; // can be accessed by instantiated object's calling code

    var myPrivateProperty = 1; // can't be accessed outside of this module

    o.myPublicFunction = function() {
        myPrivateFunction();
        return myPrivateProperty;
    };

    function myPrivateFunction() {
        ++myPrivateProperty;
        ++o.myPublicProperty;
    }

    o.getMyPrivateProperty = function() {
        return myPrivateProperty;
    }

    return o;
})();

console.log(m.myPublicProperty);       // 0
console.log(m.getMyPrivateProperty()); // 1
console.log(m.myPrivateProperty);      // undefined
console.log(m.myPublicFunction());     // increments
console.log(m.myPublicProperty);       // 1
console.log(m.getMyPrivateProperty()); // 2

http://jsfiddle.net/dbrecht/EQ4Tb/

Немного не по теме, но это немного странно для меня:

if(typeof MyNamespace === 'undefined'){
    var MyNamespace = {};
}

Почему бы просто не использовать: var MyNamespace = MyNamespace || {};?

0 голосов
/ 18 ноября 2011

Да, частные переменные.

var MyNamespace = MyNamespace || {};

(function(){

    var priv_var = 'bar';

    MyNamespace.MyClass = function(){
        this.property = 'foo';

        //priv_var is accessible in here

        return this;
    }

}());

В сравнении:

var MyNamespace = MyNamespace || {};

var priv_var = 'bar';

MyNamespace.MyClass = function(){
    this.property = 'foo';

    //priv_var is accessible anywhere

    return this;
}
0 голосов
/ 18 ноября 2011

В простом случае, который вы показали, немедленно выполняемая анонимная функция не дает никаких преимуществ.

Однако вы можете объявить переменные или другие функции внутри области действия анонимных функций, и они будут по сути закрытыми.к вашей функции MyClass.Так что это огромное преимущество, и даже если вам не нужны частные переменные сейчас, вы можете позже, чтобы вы могли использовать анонимную функцию в любом случае ...

Обратите внимание также на то, что размещение оператора var внутри if является своего родабессмысленно, потому что объявление (но не присвоение) «поднимается» из блока.

0 голосов
/ 18 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...