这个 eval 条件的目的是什么?

What is the purpose of this eval conditional?

我在这里浏览源代码:http://js-dos.com/games/doom2.exe.html 并注意到一些事情:

if (typeof Module === 'undefined') 
{
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}

我的问题:如果它只会再次尝试 return 模块,那么用自调用函数声明模块有什么意义?不是已经被证明不存在了吗?为什么不直接将 Module 显式声明为 {}

如果 Module 是恰好包含 undefined 的局部变量,

typeof Module 可能未定义。此代码旨在支持一些情况,模块可能是本地的或全局的,以及已定义或未定义的。我们想避免污染全局范围,所以我们不只是在未定义的情况下执行 Module = ...

首先,通常情况是 emscripten 在全局范围内生成代码。在这种情况下,Module 可能会或可能不会被定义,并且可能是本地的但仍然undefined,因此我们需要同时处理这两个问题。

其次,emscripten代码可能只是一个模块,就像使用ammo.js的游戏一样。在那种情况下,用法是

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

所以在这种情况下,模块是一个本地函数,作为已经为我们定义的参数给出。

我们不能只声明 var Module 因为这意味着 Module 是一个局部变量。所以我们需要评估。对于 eval,我们需要一个 returns 值的函数,因为我们需要一个 try-catch。 try-catch使用的是Module,如果Module不是本地的(不管是否包含undefined就会抛出),这正是我们想要的

虽然可以简化此代码!