我在这里浏览源代码:http://js-dos.com/games/doom2.exe.html并注意到一些事情:
if (typeof Module === 'undefined')
{
Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
var
进行声明,这次它会检查模块是否存在。 我的问题:如果模块只尝试再次返回模块,那么使用自调用函数声明模块有什么意义呢?还没有证明它不存在吗?为什么不直接将Module声明为{}
?
答案 0 :(得分:5)
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
),它将抛出,这正是我们想要的。
尽管可能会简化此代码!