Javascript 创建一个空范围?

Javascript 创建一个空范围?,javascript,architecture,Javascript,Architecture,有没有办法定义范围,使其完全为空?理想情况下,这将导致窗口未定义。或者,窗口是否在每个范围排列中始终可用?我最初的想法是将一个空对象应用于闭包的applying,但是window仍然定义为: (function() { console.log(this); // an empty object console.log(window); // the window object is still defined }).apply({}); 有没有办法绕过窗口及其相关变量,或者我现

有没有办法定义范围,使其完全为空?理想情况下,这将导致
窗口
未定义。或者,
窗口
是否在每个范围排列中始终可用?我最初的想法是将一个空对象应用于闭包的
apply
ing,但是
window
仍然定义为:

(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({});
})();

最终目标是什么?理想情况下,我希望能够控制范围内的所有变量,例如,我可以记录当前范围内的所有内容,并使结果成为我定义的唯一变量。我的意思是,很明显,这只是一个例子,我可以通过不在
[本机代码]
toString
值中记录任何内容来实现,但希望它能说明我的目标。我希望在浏览器中找到与JS相关的答案,理想情况下,我希望避免对每个全局变量进行单独的重击,因为这并不像我希望的那样灵活。但是,如果不可能,我会接受这个答案。