有没有办法定义范围,使其完全为空?理想情况下,这会导致窗口未定义.或者窗口始终可用于每个范围的排列?我最初的想法是将一个空对象应用于闭包,但仍然定义了窗口:
(function() {
console.log(this); // an empty object
console.log(window); // the window object is still defined
}).apply({});
有没有办法绕过窗口及其相关变量,或者我现在只是觉得好笑?
最佳答案 如果您在浏览器之外执行javascript,则不必拥有窗口对象.例如,nodejs脚本没有窗口对象,但它们确实有一个全局流程对象.
如果你真的想要没有可用的窗口对象,你可以用新范围内的局部变量来破坏它…
(function(){ var window = undefined; console.log(this); console.log(window) }).apply({});
这不会触及全局窗口对象,它不能被破坏,但应该在本地覆盖它.
一个更通用的包装器,因为内部范围继承自外部范围……
(function(){ var window = undefined; (function(){
console.log(this);
console.log(window);
}).apply({}); })();
编辑:为所有全局变量添加通用解决方案……
// create self invoking anonymous function
;(function(){
// enumerate all global objects (`this` refers to current scope - assumed to be global at this point)
var globals = Object.keys(this);
// loop through all globals
for(i in globals){
// don't clobber the `console` global - we will need it!
if(globals[i] !== "console"){
// initialise local variable in current scope with name of every global
eval("var " + globals[i]);
};
};
// create scope with empty object for `this` and all globals reset
;(function(){
console.log(this);
console.log(window);
/* for node.js, check process, not window ... */
// console.log(process);
}).apply({});
})();