0

小型化された JavaScript ファイル J1 を使用する XSL テンプレートがあります。J1 をトレースしてリバース エンジニアリングすることは不可能であると想定できます。

私が抱えている問題は、J1 の少し更新されたバージョン (J1a と呼ばれる) があり、同じテンプレート内のコードの一部に J1 を使用し、コードの他の部分に J1a を使用することに興味があることです。明らかに、同じファイルに両方を含めると、重複するクラスと関数が原因で問題が発生します。次のコードを使用して、J1 または J1a を疑似名前空間 (Javascript は名前空間またはモジュールをサポートしていません) にラップすることはできませんでした。

function mynamespace() {
  this.container = {
  // insert monstrous javascript blob
  }
} // which then is expected to do sth like mynamespace.Container.SomeFunction()

また、膨大な数の名前の名前を手動で変更するだけでダーティ リファクタリングを試みましたが (これは非常にエラーが発生しやすくなっています)、どちらのアプローチも機能しません。

この投稿の執筆中に、私は 3 番目のアプローチを考えました。それは、J1 に関数 X() を追加し、J1a に関数 Y() を追加して、問題を解決する必要があるラッパー関数にタスクを委任することです。 J1 と J1a が相互にインポートしないことに注意してください。ただし、私はこれをテストしておらず、経験豊富な JavaScript ライターでもありません。

編集:

J1とJ1aから本当に必要なのは次のとおりです。

MyObject.SomeStaticMethod();
MyObject obj = new MyObject(args);
obj.SomeInstanceMethod();

それから多分私はできる:

 function X(var args) {
     MyObject.SomeStaticMethod();
     MyObject obj = new MyObject(args);
     obj.SomeInstanceMethod();
 }
 function Y(var args) {
     MyObject.SomeStaticMethod();
     MyObject obj = new MyObject(args);
     obj.SomeInstanceMethod();
 }

J1 に X を追加し、J1a に Y を追加してから、XSL テンプレートで X() と Y() を選択的に呼び出しますか?

編集 2: 巨大な小型化された JavaScript ブロブには、従来のグローバル変数が含まれていないことがわかりましたが、Windows オブジェクトにつながれた変数と同じくらい悪いものです。

そうは言っても、HTML のレンダリングを何らかの方法で分割して、1 つの部分がグローバル スコープに 1 つのコピーのみを持ち、別の部分がグローバル スコープに他のコピーを持つようにする方法はありますか? JSP には「タイル アプローチ」があると聞いたことがあります。フレームも可能ですが、使用には多くの問題があると聞きました.

4

1 に答える 1

1

node の動作を模倣するバリアントを次に示します。

function mynamespace() {
  var container = {};

  // insert giant blob here

  container.exposed1 = something_to_expose;
  container.exposed2 = something_else_to_expose;

  return container;
}

次に使用します

var v1 = mynamespace();
v1.exposed1();

等....

また、巨大なブロブがグローバル変数を使用していないことを確認する必要があります。

于 2013-01-29T02:44:43.583 に答える