Как библиотеки 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 разных контекстов выполнения, выделяя память во время выполнения и уничтожая ее после завершения выполнения. Это не имеет никакого отношения к загружаемому коду библиотеки.