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相关的答案,理想情况下,我希望避免对每个全局变量进行单独的重击,因为这并不像我希望的那样灵活。但是,如果不可能,我会接受这个答案。