【发布时间】:2013-05-25 06:35:02
【问题描述】:
我通常认为全局作用域是一个始终可以从任何地方访问的命名空间。我想知道理论上是否可以完全隐藏全局范围。例如,假设我们有一些想要evaluate 的代码(在浏览器的控制台中):
var code =
"console.log(this); " + // access the global object directly
"console.log(window); " + // access the global object as the window object
"newGlobalVar = 42; "; // implicitly create global object
eval(code);
通过包装eval 调用,this 和window 可以对code 隐藏:
(function (window) { eval(code); }).call({});
但我无法阻止code 隐式创建全局变量。有可能吗?我不想用这个东西,我只是好奇。
【问题讨论】:
-
您是否要对
eval'd/任意代码进行沙箱处理?如果这是您的目标,还有更好的方法。 -
不,我只是想从用户代码中屏蔽全局范围。这让我想到了这个问题,它是关于理论的。
-
那么,在现代浏览器中,理论上你可以freeze
window对象。虽然我从未尝试过。 -
@FabrícioMatté 很有趣。我刚刚在 Safari 5.1.9 中尝试冻结和密封,它适用于一般对象,但不适用于全局对象。
-
@Zorgatone 运行任意不受信任的代码是一项艰巨的任务,我会尽一切努力避免它。但如果你真的需要,这些资源可能会很有用:
vm.runInNewContext()(仅限 Node.js)、Aether(沙盒不完整,理想情况下应该在 Web Worker 中运行)和Dr. SES(基于能力的安全性)。
标签: javascript global-variables eval information-hiding