我通常认为全局范围是一个总是可以从任何地方访问的命名空间.我想知道理论上是否有可能完全隐藏全球范围.例如,假设我们有一些我们想要评估的代码(在浏览器的控制台中):
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);
(function (window) { eval(code); }).call({});
解决方法
如果你在相当现代的浏览器中运行,你可以通过创建一个阴影窗口的函数和带参数的自变量来阻止窗口访问,并以严格模式运行代码.
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对象,而这个值也将是我们的obj.
因为我们处于严格模式,所以不允许使用隐式全局变量.此外,默认此函数值将是undefined而不是window.
我认为有一些黑客可能会解决这个问题,但这应该涵盖大多数情况.