我通常将全局范围视为始终可以从任何地方访问的 namespace 。我想知道在理论上是否可以完全隐藏 全局范围。例如,假设我们有一些代码想要eval
uate(在浏览器的控制台中):
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
隐式创建全局变量。有可能吗?我不想使用这些东西,我只是好奇。
最佳答案
如果您在相当现代的浏览器中运行,您可以通过创建一个隐藏 window
和 self
的函数来阻止 window
访问带有参数的变量,并以严格模式运行代码。
var obj = {};
var func = new Function("self", "window", "'use strict';" + code);
func.call(obj, obj, obj);
console.log(obj); // see if there were any attempts to set global variables.
任何访问 window
或 self
的尝试都只会访问我们的 obj
对象,以及 this
的值也将是我们的 obj
。
因为我们处于严格模式,所以不允许使用隐式全局变量。此外,函数的默认 this
值将是 undefined
而不是 window
。
我认为有一些技巧可以解决这个问题,但这应该涵盖大多数情况。
关于JavaScript - 如何从 eval 脚本中隐藏全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16823391/