隔离JavaScript的执行

前端之家收集整理的这篇文章主要介绍了隔离JavaScript的执行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阻止我最多的JS的限制之一是隔离代码执行的能力差.

我想要能够控制代码执行的上下文,可以实现与Script.createContext和amp相似的效果. node.js中的Script.runInContext(节点正在使用绑定到V8引擎,因此我无法模拟其实现).

这是为什么我要隔离代码执行的一些原因:

>从全局命名空间(窗口对象和DOM)中分离代码,但是我需要能够对在上下文中公开的对象进行引用函数调用,这些对象必须执行同步,这使得几乎不可能使用WebWorker进行隔离.
>通过隔离代码的执行,在不再需要时(内存管理)也可以释放其定义.

我知道可以通过将脚本加载到iframe中来实现部分孤立的执行,但是这种方法非常繁琐,并且对于第二个DOM实例使用了很多内存,这对我正在尝试的不需要.

我需要共享构造函数定义和对象的定义,这些定义在两个必须在主UI线程上运行的隔离容器/上下文之间共享.主要是我想使用这些隔离的容器来托管插件/模块(迷你应用程序),它们通过在自己的Context2D对象上调用绘图命令来呈现和动态更新视口.

如果这些容器没有在主UI线程上运行,那么很难代理调用,比如ctx.measureText()和ctx.drawImage(),因为在Worker中无法创建镜像对象,所以这些容器都是无用的.

有人知道未来的规范会使这成为可能吗?

是否有可用于实现此目的的当前(隐藏)浏览器端API?

会更好地利用像Goggle的Dart VM这样的虚拟机,还可以重新实现我目前的代码库?
我目前的代码库略高于20万行代码.

是否更好地重新实施框架*

解决方法

您可以使用简单的自行执行函数对象将代码与全局命名空间隔离开:
(function() {
   // all your code goes here
   // nobody outside of your code can reach your top level variables here
   // your top level variables are not on the window object

   // this is a protected,but top level variable
   var x = 3;

   // if you want anything to be global,you can assign it to the window object.
   window.myGlobal = {};

   function myTopLevelFunction(x,y,z) {
       // code here
   }

})();

如果你想拥有这些执行上下文中的多个,并且能够在它们之间共享,那么你必须通过一个公知的位置进行会合,一个真正的全局变量或一个已知的DOM对象上的属性,或者类似的.声明一个全局命名空间对象是相对常见的,并使用属性来访问您在模块之间共享的内容.我知道这不完全是完美的,但它是有效的.以下是使用单个全局命名空间对象进行重新集合的示例:

// module AAA
(function() {
   // module AAA code goes here

   // set up global namespace object and whatever references we want to be global
   window.myModuleTop = window.myModuleTop || {};
   myModuleTop.AAA = {};
   myModuleTop.AAA.myFuncA = function() {};

})();


// module BBB
(function() {
   // module BBB code goes here

   // set up global namespace object and whatever references we want to be global
   window.myModuleTop = window.myModuleTop || {};
   myModuleTop.BBB = {};
   myModuleTop.BBB.myFuncB = function() {};

})();

猜你在找的JavaScript相关文章