Как библиотеки javascript доступны, когда они упакованы в IIFE? Разве контекст исполнения не расположен?

В библиотеке Underscore js весь код находится внутри:

(function() {  
     //rest of library etc.
}.call(this));

Я понимаю, что перенос функции () в () предназначен для целей пространства имен, и что.call(this) вызывает библиотеку при запуске, передавая объект окна.

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

На вопрос был дан ответ, но он поднял этот вопрос в моей голове:

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

Не было бы предпочтительнее сделать что-то вроде:

var library1 = function(
     var func1 = function(){ 

     }; 
  return { 
     func1: func1 
  })(this);

1 ответ

Решение

Эта концепция может быть объяснена здесь на простом примере:

//library code starts
(function(){

    this.hello = function(){
        console.log("asd");
    }

}).call(this);
//library code ends


//outside the library
//will print the function showing that it is available outside the library
console.log(window.hello); //will print the function
console.log(hello); 

//will console.log hello
hello();

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

Поскольку функция hello привязана к объекту окна, она доступна для вызова вне кода библиотеки.

Это относится к любой функции или переменной, связанной с объектом окна.

Понимание контекста исполнения

Контекст выполнения создается только тогда, когда вызывается определенная функция или используется некоторая переменная / объект.

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

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

Другие вопросы по тегам