如何严格限制范围?我尝试了包装和Function类,但是即使我可以通过创建具有相同名称的作用域变量来阻止self,window和globalThis。它们的项目仍然存在,并且可以在该代码块中使用。
一个例子,应该算是过大了,但仍然允许访问self.location。
(function () {
"use strict";
const foo = new Function('', "'use strict';const window=null, self=null, globalThis=null;console.log('global containers...',window,self, globalThis);return location");
console.log(foo());
})()
产生。...
global containers... null null null
Location {...}
...在谷歌浏览器中。我想了解如何限制或限制一般包含环境的作用域。
如何仅将本地作用域用于块或功能代码?
答案 0 :(得分:0)
让我知道的是,除了设置为您不希望脚本访问的每个变量之外,没有办法阻止浏览器中全局变量的访问变量。
这是使用IIFE的一种干净方法:
(function({window, self, location, globalThis}) {
.. your code ..
})({
window: undefined,
self: undefined,
location: undefined,
globalThis: undefined
)}
如果仅将某些全局变量作为目标,则可以使用此技术。当然不理想,但是还可以。
如果您想阻止访问每个window
变量,请采取以下措施:
我们想使用new Function
的替换项,但这会创建一个空环境,就像这样:
var add = new StrictScopeFunction(
['a', 'b'],
'console.log(typeof window, typeof location, a + b)'
);
add(12, 24); // print : undefined, undefined, 36
这是StrictScopeFunction
函数的代码:
const StrictScopeFunction = (function() {
// we find *once* all window variables (because it's an heavy operation)
const globals = ['window', 'globalThis']; // list of variables you don't want
for (let prop in globalThis)
globals.push(prop);
return function(args=[], code="") {
const strictScope = {};
for (const prop of globals) {
// if the global property is not an argument of the new function
if (!args.includes(prop))
strictScope[prop] = undefined;
}
const func = new Function('{'+ Object.keys(strictScope).join(',') +'}', ...args, code);
return func.bind(null, strictScope);
}
})();