Ребята, у меня возник вопрос по поводу самовызывающихся функций (IIFE) в JavaScript. Я пытаюсь передать функцию в качестве аргумента конструктору внутри IIFE, но столкнулся с неожиданным поведением.
Когда я делаю это вне IIFE, все работает как ожидается - функция просто передается, но не выполняется:
var Класс = function(метод) {
this.метод = метод;
};
new Класс(function() { console.log("проверка"); });
Но внутри IIFE происходит что-то странное:
(function() {
var Класс = function(метод) {
this.метод = метод;
};
Класс.ПОЛЕ = new Класс(new function() { console.log("проверка"); });
return Класс;
})();
В этом случае “проверка” выводится в консоль. Я использую IIFE, чтобы не засорять глобальную область видимости, но не хочу, чтобы функция сразу выполнялась.
Как можно это исправить? Может, я что-то неправильно понимаю в работе IIFE? Буду благодарен за любые идеи!
Да, проблема не в IIFE, а в лишнем new перед функцией. Это вызывает её мгновенное выполнение. Просто убери new и оставь обычное объявление функции:
Класс.ПОЛЕ = new Класс(function() { console.log(“проверка”); });
Так функция будет передана как аргумент, но не выполнится сразу. IIFE тут ни при чем, она только изолирует код от глобальной области. Главное - не создавать новый экземпляр функции через new.
Смотри, проблема не в IIFE, а в использовании new перед функцией. Это приводит к её немедленному вызову. Убери new, оставив просто функцию, и всё заработает как надо. IIFE здесь лишь создает локальную область видимости и не влияет на запуск функции.
Привет! Я тоже сталкивался с похожей проблемой. Дело в том, что в твоем втором примере ты используешь оператор new перед функцией, что и вызывает ее выполнение. Попробуй убрать new перед function() { console.log(“проверка”); } и должно заработать как надо.
Вот так должно быть правильно:
(function() {
var Класс = function(метод) {
this.метод = метод;
};
Класс.ПОЛЕ = new Класс(function() { console.log("проверка"); });
return Класс;
})();
IIFE тут вообще ни при чем, проблема была именно в лишнем new. надеюсь, это поможет!