Javascript 提升局部变量屏蔽全局变量?
在Javascript 提升局部变量屏蔽全局变量?,javascript,node.js,emscripten,Javascript,Node.js,Emscripten,在节点中遇到奇怪的行为。我有一个编译过的程序,我想用作库emscripten使用变量Module控制运行时行为,并生成如下代码/lib/g.js。在浏览器中,模块从index.js中定义的全局变量到/lib/g.js中的本地变量进行了正确的别名。但是,在节点中,情况似乎并非如此。构造:var Module=Module |{}清除我的全局模块 index.js: global.Module = { name: 'Module' }; var g = require ( './lib/g.js'
节点中遇到奇怪的行为。我有一个编译过的程序,我想用作库emscripten
使用变量Module
控制运行时行为,并生成如下代码/lib/g.js
。在浏览器中,模块
从index.js
中定义的全局变量到/lib/g.js
中的本地变量
进行了正确的别名。但是,在节点中,情况似乎并非如此。构造:var Module=Module |{}代码>清除我的全局模块
index.js
:
global.Module = { name: 'Module' };
var g = require ( './lib/g.js' );
console.log ( 'Module: ', Module );
var Module = Module || {};
Module: undefined
/lib/g.js
:
global.Module = { name: 'Module' };
var g = require ( './lib/g.js' );
console.log ( 'Module: ', Module );
var Module = Module || {};
Module: undefined
节点index.js的输出
:
global.Module = { name: 'Module' };
var g = require ( './lib/g.js' );
console.log ( 'Module: ', Module );
var Module = Module || {};
Module: undefined
模块:未定义
我假设在g.js
中,Module
仅在本地范围内提升和取消引用,屏蔽了全局版本(在global.Module
中)。有人能提出一个工作建议吗
通过编辑emscripten
生成的代码以使用var Module=global.Module |{}
,可以解决此问题。虽然这是一种可能的解决方法,但我不希望编辑由emscripten
生成的代码
有人能提出一个工作建议吗
只需删除var
关键字。您可以看看如何使用
如果在更高的作用域中定义了一个模块
,那么var Module=Module | |{}
将在这个作用域中为它创建一个别名。访问Module
上的属性可以很好地访问作用域更高的变量的属性。@jfriend00:这是预期的行为,但在给出的示例中不是这样。可以在浏览器中正常工作,但不能在节点中正常工作。未找到涵盖此情况的节点的变量作用域规则。看起来emscripten确实希望其输出脚本在全局范围内运行,而不是在模块范围内运行。如果不想编辑代码,可以尝试全局评估。在我看来,emscripten正在使用的全局模块
与节点使用的全局模块
之间存在冲突。也许他们都在试图定义/使用同一个问题,或者其中一个正在重新定义并覆盖另一个问题。为了清晰起见,编辑了该问题。我试图避免的是编辑由emscripten
生成的代码。更改生成的代码并不总是一个好主意。将直接询问emscripten
社区。