Пожалуйста, объясните это определение функции JavaScript и их лучшее использование (Шаблон модуля) - PullRequest
0 голосов
/ 29 ноября 2011

Какого типа функции являются следующими и как лучше всего их использовать?

var f = function (){
    var a = 0;
    return {
        f1 : function(){
        },
        f2 : function(param){
        }
    };
}();

Я пытался преобразовать его в:

var f = {
    a : 0,
    f1: function (){
    },
    f2: function (param){
    }
}

Но, кажется, не работает так же.

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

Это просто старая старая функция, которая вызывается немедленно и возвращает объект, на который затем ссылается f.

Функции, на которые ссылается возвращаемый объект, сохраняют способность ссылаться на переменную a.

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

Этот шаблон иногда называют модульным шаблоном .


Что касается вашего обновленного вопроса, он не работает так же, потому что a теперь является общедоступным свойством объекта.

Для функций, ссылающихся на него, они могут выполнить:

f.a;

или если функция будет вызываться из объекта f, они могут выполнить:

this.a;

Вот так:

var f = {
    a : 0,
    f1: function (){
        alert( this.a );
    },
    f2: function (param){
        this.a = param;
    }
}

f.f2( 123 );

f.f1(); // alerts 123

Но главное, что a общедоступно. Любой код, имеющий доступ к f, может обращаться к f.a и, следовательно, вносить в него изменения без использования функций f1 и f2.

В этом прелесть первого кода. Вы можете точно контролировать, что происходит с a.

1 голос
/ 29 ноября 2011

По сути, это создает "класс" - у JS нет классов, поэтому класс - это, в основном, функция, такая как ваша функция f.

Интересным в опубликованном вами коде является то, что он создает приватную переменную a и две открытые функции f1 и f2. Они общедоступны, потому что конструктор - внешняя функция - возвращает их.

Это общий шаблон для организации и инкапсуляции кода JS.

Подробнее об этом можно прочитать здесь

1 голос
/ 29 ноября 2011

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

Сначала объявляется локальная (или частная) переменная a, видимая только в области действия функции. Затем он создает объект, который имеет члены f1 и f2, которые оба являются функциями. Так как этот возвращаемый объект объявлен в той же области, что и объявленный a, и f1, и f2 будут иметь доступ к.

Ваше преобразование просто создает один объект. Если раньше у вас была функция, которая создавала бы бесконечные объекты, то теперь у вас есть один объект, и не более. Я не уверен точно, почему это не работает, но одно существенное отличие состоит в том, что a теперь виден миру, где раньше он был закрыт для возвращаемого объекта.

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