【发布时间】:2014-11-15 04:17:18
【问题描述】:
在node 中遇到了奇怪的行为。我有一个emscripten 编译程序,我想将它用作库。 emscripten 使用变量Module 来控制运行时行为,并生成类似于下面./lib/g.js 的代码。在浏览器中,Module 正确地从index.js 中定义的全局别名到./lib/g.js 中的本地var。但是,在node 中,情况似乎并非如此。构造:var Module = Module || {}; 清除了我的全局 Module。
index.js:
global.Module = { name: 'Module' };
var g = require ( './lib/g.js' );
./lib/g.js:
console.log ( 'Module: ', Module );
var Module = Module || {};
node index.js 的输出:
我假设在g.js 中,Module 仅在本地范围内被提升和取消引用,屏蔽了全局版本(在 global.Module 中)。任何人都可以提出解决方法吗?
可以通过编辑emscripten 生成的代码以使用var Module = global.Module || {} 来解决此问题。虽然这是一种可能的解决方法,但我宁愿不编辑emscripten 生成的代码。
【问题讨论】:
-
如果在更高的范围内定义了
Module,那么var Module = Module || {}只会在这个范围内为其创建一个别名。访问Module上的属性可以很好地访问更高范围变量的属性。 -
@jfriend00:这是预期的行为,但在给出的示例中并没有这样工作。在浏览器中可以正常工作,但在
node中不能正常工作。没有找到涵盖此案例的node的变量范围规则。 -
看起来 emscripten 确实希望其输出脚本在全局范围内运行,而不是在模块范围内。如果您不想编辑代码,可以尝试全局评估。
-
在我看来,emscripten 正在使用的全局
Module与节点使用的全局Module之间存在冲突。也许他们都试图定义/使用相同的,或者一个正在重新定义和覆盖另一个。
标签: javascript node.js emscripten