如何严格限制功能或块中的范围?

时间:2019-12-02 16:25:26

标签: javascript

如何严格限制范围?我尝试了包装和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 {...}

...在谷歌浏览器中。我想了解如何限制或限制一般包含环境的作用域。

如何仅将本地作用域用于块或功能代码?

1 个答案:

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

最后一点,如果您在Node环境下,则可以查看vm标准模块-或vm2软件包。