Когда нужно использовать IIFE и передавать параметры? Javascript

Большинство разделов моей библиотеки состоят из файлов, которые имеют такую ​​структуру,

myLib.Something = (function() {

     function Something() {

     }

     return Something;

})();

Теперь предположим, что внутри Something я использую document или же window так что теперь мой файл выглядит так;

myLib.Something = (function() {

     function Something(id) {

         this.somethingElse = document.getElementById(id);
     }

     return Something;

})();

При использовании документа внутри Somethingконструктор должен передать документ во IIFE, чтобы он выглядел так, как показано ниже;

myLib.Something = (function(document) {

     function Something(id) {

         this.somethingElse = document.getElementById(id);
     }

     return Something;

})(document);

Или я должен передавать переменные в IIFE только тогда, когда они используются вне Something? Как ниже,

myLib.Something = (function(document) {

     var document = document;

     function Something() {

     }

     return Something;

})(document);

1 ответ

Как уже упоминалось в комментариях, ваш третий и четвертый примеры почти эквивалентны. Добавление var document = document; ничего не делает (и выдает ошибки в строгом режиме).

Есть несколько причин, по которым вы можете использовать IIFE здесь, хотя я не думаю, что в этом случае это необходимо.

Во-первых, как упоминает @C5H8NNaO4, это можно использовать, чтобы убедиться, что у вас есть чистые ссылки на глобальные объекты. Однако это зависит от того, загружен ли ваш скрипт перед любыми пользовательскими скриптами.

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

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

(function (alias) {

    // do something with alias

} (library.that.has.namespaced.stuff));
Другие вопросы по тегам