我想要能够控制代码执行的上下文,可以实现与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() {}; })();