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

rai*_*gun 11 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 {} }})()');
}
Run Code Online (Sandbox Code Playgroud)
  • Module函数使用内联脚本标记定义
  • 稍后var在另一个内联标记中再次声明它,这次它检查模块是否存在.

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

小智 5

typeof Module如果Module是恰好包含的局部变量,则可能未定义undefined.此代码旨在支持少数情况,Module可能是本地的或全局的,并且已定义或未定义.我们希望避免污染全局范围,因此我们不会只是做Module = ...它未定义的事情.

首先,通常的情况是全局范围内的emscripten生成的代码.在这种情况下,模块可能会或可能不会被定义,并且可能是本地的但仍然是undefined,所以我们需要处理这两者.

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

function Ammo(Module) {
  // emscripten-generated code, uses the Module
  return something;
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,这个代码可能会被简化!

  • 由于你没有提到它,为了记录:**Alon是这些行的作者.** (2认同)
  • github和SO的组合是非常令人印象深刻和有用的,因为能够提出这样的问题并将其加入到提交中,然后是作者,然后可以回答问题. (2认同)