javascript – 创建一个空范围?

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

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