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()

我还尝试了通过手动重命名大量名称(这很容易出错)来进行肮脏的重构,但是这两种方法都不起作用。

在写这篇文章的过程中,我想到了第三种方法,即在 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();
 }

并将 X 添加到 J1 并将 Y 添加到 J1a 然后在 XSL 模板中选择性地调用 X() 和 Y() ?

编辑 2:事实证明,巨大的小型化 javascript blob 不包含传统的全局变量,而是一些同样糟糕的东西 - 与 windows 对象绑定的变量。

话虽如此,有没有办法以某种方式拆分 HTML 的呈现,以便一部分在全局范围内只有一个副本,而另一部分在全局范围内有另一个副本?我听说JSP 有一些“平铺方法”。框架也是一种可能,尽管我听说使用它们有很多问题。

4

1 回答 1

1

这是一个模仿节点功能的变体。

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();

ETC....

您还需要确保您的巨型 blob 不使用任何全局变量。

于 2013-01-29T02:44:43.583 回答