同时使用两个几乎相同的javascript文件

时间:2013-01-29 02:37:27

标签: javascript namespaces

我有一个使用小型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有一些“瓦片方法”。框架也是可能的,虽然我听说使用它们有很多问题。

1 个答案:

答案 0 :(得分: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();

等...

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