【发布时间】:2012-01-10 00:58:54
【问题描述】:
我有一种情况,我试图将几个 Javascript 文件合并为一个,并有条件地应用它们。我不想修改实际文件。有没有办法可以包装这些文件并按需调用它们?
问题是,其中一些文件中包含函数 xyz() {}。所以,用 if (false) { function xyz() {} } 包装它们会导致坏事发生。
例如,如果这是我的代码...
if (includeFile) {
/* The file */
function foo() {}
/* The file */
}
问题在于 Chrome 会看到 foo() 并将其放在全局范围内 even if includeFile is false。
简单的解决方案是将其修改为 var foo = function() {} 但我无法修改这些文件。
我也普遍担心在这些函数上运行 eval(),因为它们相当大。 (想想 jQuery 包装在一个函数中。如果这不是问题,那么也许 eval 就是答案?)
我希望我可以嵌套函数并将窗口作为范围传递,但是tried it on jsFiddle and it didn't seem to work。
(function() {
function foo() {
alert('it works');
}
}).apply(window, []);
foo();
【问题讨论】:
-
所以问题是多个文件之间存在名称冲突 - 多个函数 xyzs?修改它们真的那么糟糕吗——你担心引入错误,或者与上游保持兼容?你能机械地重命名吗,例如sed 或以某种方式使用缩小工具?
-
我也在考虑使用缩小工具或宏预处理器。你要处理多少个
xyzs?而且,如果只有部分内容要在任何给定页面上执行,那么将所有这些内容放在一个文件中真的是最好的主意吗? -
嗯,这个想法是根据页面和上下文,我们加载的文件太多。大约有 100 种不同的资源(包括 CSS/图像)。因此,为了减少这个数字,我们试图合并一些经常使用的文件。在这种情况下,有些是库,有些是我们的内部代码。到目前为止,我们还没有担心将函数 xyz() {} 放在全局范围内。使用新的组合文件, if (false) { function xyz() {} } 最终在全局范围内,所以我们想将它包装在 var foo = function() { function xyz() {} };如果 (假) { foo(); }
标签: javascript function scope global