Вызов IIFE из другого файла Javascript

У меня есть файл bg.js, содержимое которого представляет собой просто IIFE. Я хотел бы загрузить этот файл/вызвать функцию из другой функции в другом файле. Поскольку IIFE является анонимным (так оно и есть, верно?), я не могу назвать его по имени. Кажется, мне нужно загрузить весь файл, чтобы он выполнялся немедленно.

Я выполнил поиск и нашел много руководств и документов о том, что такое IIFE, но нигде не видел, как выполнить его из другой области.

Как вызвать/загрузить файл javascript, который является IIFE, из другого файла javascript?

Дополнительная информация IIFE загружается в нижний колонтитул моей страницы. Когда я нажимаю ссылку для навигации, сценарии верхнего и нижнего колонтитула не выполняются. IIFE в нижнем колонтитуле отвечает за настройку фонового изображения, поэтому мне нужно, чтобы эта функция выполнялась в моем perPageBindings()

Что, я думаю, мне нужно сделать, так это вызвать IIFE из другой функции в теле, которая выполняется в perPageBindings()

Изменить для ясности Я рассматриваю два варианта:

  1. Просто переместите тег script в тело из нижнего колонтитула; или
  2. Дайте IIFE имя, чтобы оно больше не было анонимным, а затем вызовите эту именованную функцию из другого места.

Если 2 является жизнеспособным вариантом, я думаю, что создам новый вопрос о преобразовании и IIFE в именованную функцию.


person Ian R. O'Brien    schedule 09.10.2015    source источник
comment
Пожалуйста, дайте мне знать, если мне нужно опубликовать пример кода.   -  person Ian R. O'Brien    schedule 09.10.2015
comment
Вы можете использовать $.getScript для глобальной загрузки файла js и его выполнения.   -  person Rocket Hazmat    schedule 09.10.2015
comment
по определению IIFE вызывается немедленно - нет смысла вызывать его из другого файла.   -  person Jamiec    schedule 09.10.2015
comment
Создайте тег скрипта, установите в качестве источника тега файл, содержащий IIFE, используйте тег скрипта для получения скрипта. Затем будет выполнен IIFE. Но вы не сможете использовать что-либо внутри IIFE, если не вернете интерфейс из этого IIFE, который может использовать другой сценарий.   -  person Shilly    schedule 09.10.2015
comment
В JavaScript нет функции включения. Вы можете загрузить файл через AJAX и запустить его в текущей области видимости, но при этом будет использоваться eval(), что является плохой идеей.   -  person Rocket Hazmat    schedule 09.10.2015
comment
Это похоже на проблему XY. Нужна дополнительная информация о том, что делает IIFE и что вы хотите, чтобы он делал и в какой последовательности   -  person charlietfl    schedule 09.10.2015
comment
Я думаю, что если вы включите некоторый код и свое фактическое намерение, вы можете обнаружить, что получите ответ, который даст вам лучший способ/альтернатива   -  person Jamiec    schedule 09.10.2015
comment
Я добавил дополнительную информацию, но мне придется подождать до вечера, чтобы опубликовать код, так как сейчас у меня нет к нему доступа.   -  person Ian R. O'Brien    schedule 09.10.2015
comment
Реструктурируйте IIFE, чтобы это была функция, которую вы можете вызывать при необходимости.   -  person charlietfl    schedule 09.10.2015
comment
Принудительно перезагрузите тег script, содержащий IIFE, удалив его и повторно добавив. Это приведет к повторному выполнению IIFE. stackoverflow .com/questions/9642205/   -  person Preston S    schedule 09.10.2015


Ответы (2)


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

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

Вам следует изучить шаблон раскрывающегося модуля, чтобы получить более полное представление.

Рассмотрим следующий фрагмент кода:

(function(global){
    /*
     * This variable will stay "private" 
     * because it is scoped to the IIF
     */
    var someProp = "Hello World";

    /*
     * This property is effectively exposed 
     * because it is accessible through 
     * myLib.foxtrot below
     */
    var someOtherProp = "Hello to you too";

    var myLib = {
        foo: "bar",
        fiz: true,
        buzz: 1,
        foxtrot: someOtherProp
    };

    /*
     * myLib is now accessible through the 
     * global that we passed to the IIF below
     * at the point of calling with "window"
     */
    global.myLib = myLib;

}(window));
person zero298    schedule 09.10.2015

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

Пример:

JS:

function setBackground () {
    // sets background and can be called whenever
}

HTML:

<footer>
    <script>
        (function () {
            setBackground();
        } ());
    <script>
</footer>
person AtheistP3ace    schedule 09.10.2015