Подтвердить что ты не робот

Идиома JavaScript: создайте функцию только для ее вызова

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

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

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

<script>
    do abcxyz
</script>

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

4b9b3361

Ответ 1

Они используют closures.

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

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

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

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

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

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

    return genIdImpl;
}();

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

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

Ответ 2

Они хотят избежать конфликтов пространства имен, я бы предположил. Кажется хорошей практикой в ​​JS.