这个评估条件的目的是什么

What is the purpose of this eval conditional?

本文关键字:是什么 条件 评估      更新时间:2023-09-26

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

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

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

如果模块是恰好包含undefined的局部变量,则typeof Module可能未定义。此代码旨在支持几种情况,模块可能是本地的或全局的,以及已定义或未定义的。我们希望避免污染全局范围,因此我们不只是在未定义的情况下Module = ...

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

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

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

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

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

不过,这段代码可能会被简化!