Javascript 此评估的目的是什么?

Javascript 此评估的目的是什么?,javascript,eval,conditional-statements,emscripten,Javascript,Eval,Conditional Statements,Emscripten,我在这里浏览源代码:注意到了一些事情: if (typeof Module === 'undefined') { Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()'); } 模块函数是用内联脚本标记定义的 它随后在另一个内联标记中用var再次声明,这次它检查模块是否存在 我的问题:如果只尝试再次返回模块,那么使用自调用函数声明模块有什么意义?难道它还没有被证明是不存

我在这里浏览源代码:注意到了一些事情:

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

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

如果模块是一个局部变量,恰好包含
未定义的
,则模块的类型可能未定义。这段代码旨在支持一些情况,模块可能是本地的或全局的,也可能是已定义的或未定义的。我们希望避免污染全局范围,所以如果它未定义,我们不只是执行
Module=…

首先,通常的情况是emscripten在全局范围内生成代码。在这种情况下,模块可能被定义,也可能没有定义,可能是本地的,但仍然是未定义的,所以我们需要同时处理这两个问题

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

function Ammo(Module) {
  // emscripten-generated code, uses the Module
  return something;
}
因此,本例中的模块是一个本地函数,作为已经为我们定义的参数提供

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


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

此代码位于emscripten项目的github上。它是在这个commit中添加的:它们已经从显式声明转移到eval语句,但是commit消息不是;我不清楚为什么!我已经添加了emscripten作为标记,那么项目中的某个人,或者熟悉它的人,可能会发现它并能够提供帮助。因为您没有提到它,请记录:Alon是这些行的作者。github和SO的组合非常令人印象深刻,非常有用,能够回答这样的问题并将其加入到提交中,然后加入到作者中,谁能回答这个问题。