Идиома JavaScript: создайте функцию только для ее вызова - PullRequest
16 голосов
/ 30 марта 2009

Я учусь YUI и иногда видел эту идиому:

 <script>
     (function x(){ do abcxyz})();
 </script>

Почему они создают функцию только для ее вызова? Почему бы просто не написать:

<script>
    do abcxyz
</script>

Например, см. здесь .

Ответы [ 2 ]

45 голосов
/ 30 марта 2009

Они используют замыкания .

Краткое объяснение: поскольку JS использует область видимости на уровне функций, вы можете выполнять множество действий внутри функции, и она останется в этой области. Это полезно для вызова кода, который не связывается с глобальным пространством имен. Это также позволяет создавать закрытые переменные - если вы объявляете переменную внутри анонимной функции и выполняете ее немедленно, только другой код внутри анонимной функции может получить доступ к этой переменной.

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

var counter = 0;
var genId = function()
{
    counter = counter + 1;
    return counter;
}

Однако теперь любой может связываться с counter , и я теперь загрязнил глобальное пространство имен двумя переменными ( counter и genId ).

Вместо этого я мог бы использовать анонимную функцию для генерации функции счетчика:

var genId = function()
{
    var counter = 0;
    var genIdImpl = function()
    {
        counter = counter + 1;
        return counter;
    }

    return genIdImpl;
}();

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

Похоже, что в примере кода YUI они просто хотят выполнить код, который вообще не загрязняет глобальное пространство имен.

3 голосов
/ 30 марта 2009

Думаю, они хотят избежать столкновений в пространстве имен. Кажется хорошей практикой в ​​JS.

...