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

时间:2015-01-03 15:35:12

标签: javascript eval conditional-statements emscripten

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

if (typeof Module === 'undefined') 
{
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
  • 模块功能使用内联脚本标记
  • 定义
  • 稍后在另一个内联标记中再次使用var进行声明,这次它会检查模块是否存在。

我的问题:如果模块只尝试再次返回模块,那么使用自调用函数声明模块有什么意义呢?还没有证明它不存在吗?为什么不直接将Module声明为{}

1 个答案:

答案 0 :(得分:5)

如果Module是恰好包含typeof Module的局部变量,则可能未定义

undefined。此代码旨在支持少数情况,Module可能是本地的或全局的,并且已定义或未定义。我们希望避免污染全球范围,因此如果未定义,我们就不会Module = ...

首先,通常的情况是全局范围内的emscripten生成的代码。在这种情况下,模块可能已定义,也可能未定义,可能是本地但仍为undefined,因此我们需要处理这两者。

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

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

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

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

尽管可能会简化此代码!