17

私を最も悩ませているJSの制限の1つは、コードの実行を分離する能力が低いことです。

コードが実行されるコンテキストを制御できるようにしたいのですが、node.jsのScript.createContext&と同様の効果を実現するものScript.runInContextです(ノードはV8エンジンへのバインディングを使用しているため、それらの実装をエミュレートできません)。

コードの実行を分離したい理由は次のとおりです。

  1. グローバル名前空間(windowオブジェクトともDOM)からコードを分離しますが、同期で実行する必要があるコンテキストで公開されたオブジェクトの関数呼び出しを参照できる必要があります。これによりWebWorker、分離にforを使用することはほとんど不可能になります。
  2. コードの実行を分離することにより、不要になったときにその定義の割り当てを解除することもできます(メモリ管理)。

スクリプトをにロードすることで部分的に分離された実行を実現できることはわかっていますがiframe、このアプローチは非常に重く、私がやろうとしていることに必要のないDOMの2番目のインスタンスに大量のメモリを使用します。

コンストラクター定義と、メインUIスレッドで実行する必要がある分離されたコンテナー/コンテキスト間で共有されるオブジェクトの定義を共有する必要があります。主に、これらの分離されたコンテナを使用して、プラグイン/モジュール(ミニアプリケーション)をホストします。プラグイン/モジュールは、それぞれが独自のContext2Dオブジェクトで描画コマンドを呼び出すことにより、ビューポートを表示および動的に更新します。

これらのコンテナがメインUIスレッドで実行されていない場合、などの呼び出しをプロキシするのは非常に困難でctx.measureText()ありctx.drawImage()、で画像オブジェクトを作成できないため、すべて役に立たなくなりますWorker

誰かがこれを可能にする将来の仕様を知っていますか?

これを実現するために使用できる現在の(非表示の)ブラウザー側APIはありますか?

GoggleのDartVMのような仮想マシンを利用し、現在のコードベースを再実装する方がよいでしょうか? 私の現在のコードベースは、20000行をわずかに超えています。

*でフレームワークを再実装する方が良いでしょうか

4

5 に答える 5

3

単純な自己実行関数オブジェクトを使用して、コードをグローバル名前空間から分離できます。

(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 オブジェクトのプロパティなど、公に知られている 1 つの場所を介してランデブーする必要があります。1 つのグローバル名前空間オブジェクトを宣言し、それ以外のプロパティを使用して、モジュール間で共有しているものにアクセスすることは比較的一般的です。完全に完璧ではないことはわかっていますが、機能します。単一のグローバル名前空間オブジェクトを使用したランデバスの例を次に示します。

// 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() {};

})();
于 2012-04-29T23:06:01.177 に答える
3

これについて私が見た中で最も近いライブラリはCajaです。

基本的に、非厳密な JavaScript コードでは、(windowブラウザで) グローバル オブジェクトにアクセスする多くの方法があり、真の分離は非常に困難な問題になります。Caja はこれにパッチを当てるためにいくつかの iframe トリックを行っていますが、正直なところ、それがどのように機能するのか正確にはわかりません。

于 2012-04-29T23:07:44.077 に答える
1

「標準」ネームスペースはオプションですか? お気に入り:

var myNamespace = {};

myNamespace.myFunc = function() { return true; }

このアプローチは、私が考えることができる最も単純であり、多くの問題の解決策になる可能性があります。実際のサンドボックスではありませんが、コードのエラーが発生しにくくなります。

于 2012-04-30T00:35:53.837 に答える