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

Почему функции выполняются с помощью функции самоисполнения?

У меня есть приложение, которое в режиме отладки написано во многих отдельных файлах javascript, но загружается синхронно как часть головного блока страницы. В выпуске я объединять все эти файлы и объединять их. Сегодня я продолжал находить ошибку в мини-версии, поэтому я загрузил один объединенный файл для отладки проблемы и обнаружил, что одна библиотека сама выполняет функцию, и это заставляет выполнять другие функции, определенные в window.

Я переработал здесь поведение с общим объектом, не имеет значения, если его окно или нет:

<head>
    <script>
        var a = {}

        a.X = function x(){
            console.log("shouldn't be executed");
        }

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>

В этом примере я получаю вывод

self execution 
shouldn't be executed 

Если я изменю вызов

<head>
    <script>
        var a = {}

        function x(){
            console.log("shouldn't be executed");
        }

        a.X = x;

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>

Тогда я просто получаю

self execution

Это то, что я ожидал. В первом примере, почему X получает вызов, когда a передается функции самоисполнения?

4b9b3361

Ответ 1

Вам не хватает ; после назначения функции a.X.

Вставка с запятой не запускается.

Элементы ( и ) вокруг анонимной функции используются для вызова предыдущей функции, а ее возвращаемое значение присваивается X.

то есть. то, что у вас есть, эквивалентно:

var a = {};

a.X = (function x(){
    console.log("shouldn't be executed");
}(
    (function(a){
        console.log("self execution");
    }(a))
));

Кстати, эта проблема является хорошим рекламой JS Lint, которая бы подняла ее.

Ответ 2

Это имеет какое-то отношение к инъекции с запятой, потому что когда я помещаю точку с запятой, она работает как ожидалось:

    var a = {}

    a.X = function x(){
        console.log("shouldn't be executed");
    }; // added semicolon

    (function(a){
        console.log("self execution");
    }(a));

Ответ 3

Вы пропустили точку с запятой ; после a.X = function x() { ...} ;

то есть.

a.X = function x(){
   console.log("shouldn't be executed");
};