这个 eval 条件的目的是什么?
What is the purpose of this eval conditional?
我在这里浏览源代码:http://js-dos.com/games/doom2.exe.html 并注意到一些事情:
if (typeof Module === 'undefined')
{
Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
- Module 函数是使用内联脚本标记定义的
- 稍后在另一个内联标签中用
var
再次声明,这次它检查模块是否存在。
我的问题:如果它只会再次尝试 return 模块,那么用自调用函数声明模块有什么意义?不是已经被证明不存在了吗?为什么不直接将 Module 显式声明为 {}
?
如果 Module 是恰好包含 undefined
的局部变量,typeof Module
可能未定义。此代码旨在支持一些情况,模块可能是本地的或全局的,以及已定义或未定义的。我们想避免污染全局范围,所以我们不只是在未定义的情况下执行 Module = ...
。
首先,通常情况是 emscripten 在全局范围内生成代码。在这种情况下,Module 可能会或可能不会被定义,并且可能是本地的但仍然undefined
,因此我们需要同时处理这两个问题。
其次,emscripten代码可能只是一个模块,就像使用ammo.js的游戏一样。在那种情况下,用法是
function Ammo(Module) {
// emscripten-generated code, uses the Module
return something;
}
所以在这种情况下,模块是一个本地函数,作为已经为我们定义的参数给出。
我们不能只声明 var Module
因为这意味着 Module 是一个局部变量。所以我们需要评估。对于 eval,我们需要一个 returns 值的函数,因为我们需要一个 try-catch。 try-catch使用的是Module,如果Module不是本地的(不管是否包含undefined
就会抛出),这正是我们想要的
虽然可以简化此代码!
我在这里浏览源代码:http://js-dos.com/games/doom2.exe.html 并注意到一些事情:
if (typeof Module === 'undefined')
{
Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
- Module 函数是使用内联脚本标记定义的
- 稍后在另一个内联标签中用
var
再次声明,这次它检查模块是否存在。
我的问题:如果它只会再次尝试 return 模块,那么用自调用函数声明模块有什么意义?不是已经被证明不存在了吗?为什么不直接将 Module 显式声明为 {}
?
undefined
的局部变量,typeof Module
可能未定义。此代码旨在支持一些情况,模块可能是本地的或全局的,以及已定义或未定义的。我们想避免污染全局范围,所以我们不只是在未定义的情况下执行 Module = ...
。
首先,通常情况是 emscripten 在全局范围内生成代码。在这种情况下,Module 可能会或可能不会被定义,并且可能是本地的但仍然undefined
,因此我们需要同时处理这两个问题。
其次,emscripten代码可能只是一个模块,就像使用ammo.js的游戏一样。在那种情况下,用法是
function Ammo(Module) {
// emscripten-generated code, uses the Module
return something;
}
所以在这种情况下,模块是一个本地函数,作为已经为我们定义的参数给出。
我们不能只声明 var Module
因为这意味着 Module 是一个局部变量。所以我们需要评估。对于 eval,我们需要一个 returns 值的函数,因为我们需要一个 try-catch。 try-catch使用的是Module,如果Module不是本地的(不管是否包含undefined
就会抛出),这正是我们想要的
虽然可以简化此代码!