Почему функции выполняются с помощью функции самоисполнения?
У меня есть приложение, которое в режиме отладки написано во многих отдельных файлах 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
передается функции самоисполнения?
Ответы
Ответ 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");
};