Какова цель этого условного условного выражения?

Я просматривал исходный код здесь: http://js-dos.com/games/doom2.exe.html и заметил несколько вещей:

if (typeof Module === 'undefined') 
{
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
  • Функция модуля определяется встроенным тегом script
  • Далее он снова объявляется с var в другом встроенном теге, на этот раз он проверяет, существует ли модуль.

Мой вопрос:. В чем смысл объявления модуля с помощью функции self-invoking, если он попытается снова вернуть модуль? Разве это уже не доказано, что его нет? Почему бы просто не объявить модуль как {}?

Ответ 1

typeof Module может быть undefined, если Module является локальной переменной, которая содержит undefined. Этот код предназначен для поддержки нескольких случаев, модуль может быть локальным или глобальным и определен или undefined. Мы хотим избежать загрязнения глобальной области, поэтому мы не просто делаем Module = ..., если он undefined.

Во-первых, обычный случай - это код, генерируемый emscripten, в глобальной области. В этом случае модуль может или не может быть определен и может быть локальным, но все еще undefined, поэтому нам нужно обрабатывать оба.

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

function Ammo(Module) {
  // emscripten-generated code, uses the Module
  return something;
}

поэтому модуль в этом случае является локальной, заданной как параметр, уже определенный для нас.

Мы не можем просто объявить var Module, потому что это означает, что модуль является локальной переменной. Так что нам нужно eval. Для eval нам нужна функция, которая возвращает значение, потому что нам нужен try-catch. Try-catch использует Module и будет вызывать, если модуль не является локальным (независимо от того, содержит ли он undefined или нет), что именно мы хотим.

Возможно, этот код можно было бы упростить!