如何在本地变量中包含javascript内容或在本地提供命名空间

时间:2014-08-05 08:08:07

标签: javascript oop

假设我已经包含了2个javascripts X和Y,并且它们都包含具有不同功能的commanNameFunction。我没有权限更改脚本X和Y的内容,以便我可以在那里应用模块化模式。现在的问题是,先前在X中声明的函数被Y覆盖。有没有什么方法可以访问这个函数,同时将它们包含在另一个javascript中。喜欢

var x = <script language="javascript" type="text/JavaScript" src="X.js"></script>
var y = <script language="javascript" type="text/JavaScript" src="Y.js"></script>

1 个答案:

答案 0 :(得分:2)

假设函数名称为commanNameFunction,假设您无法更改内容,请将其视为可怕的黑客。

<script language="javascript" type="text/JavaScript" src="X.js"></script>
<script language="javascript" type="text/JavaScript">
    var commanNameFunctionFromX = commanNameFunction;
</script>
<script language="javascript" type="text/JavaScript" src="Y.js"></script>

现在,如果您需要致电commanNameFunction,可以将其命名为:

commanNameFunctionFromX()

如果您需要为整个脚本执行此操作,那么尝试检测新对象可能会更好。警告:这非常hacky,如果你覆盖任何预定义的函数,毫无疑问会产生可怕的影响。

首先我们保存原始变量 - 在加载任何脚本之前运行它。

var existing = [];

for (var i in window) { 
 existing.push(i)
}

然后使用已存在的对象列表加载脚本,将任何新函数/对象保存到指定的命名空间。这个函数主要是这样做的,以前的黑客警告。

function saveNewToNamespace(existing, X) {
  for (var i in window) { 
    if (window[i] && existing.indexOf(i) == -1) {
       console.log("new: " + i);
       X[i] = window[i];
       window[i] = undefined;
    }
  }
}

然后,在每个新脚本之后,声明一个新变量并将新函数加载到其中。

var X = {};
saveNewToNameSpace(existing, X);