2012-01-10 102 views
1

我有一种情况,我试图将多个Javascript文件合并为一个,并有条件地应用它们。我不想修改实际的文件。有没有办法可以包装这些文件并按需求调用它们?嵌套函数可以放在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(); 

有几个similarquestions。但是,没有一个提到我有同样的情况。谢谢。

+0

所以问题是有多个文件之间的名称冲突 - 多个函数xyzs?修改它们真的很糟糕 - 你担心引入错误还是保持与上游兼容?你能否机械地进行重命名,例如sed或用某种缩小工具? – Rup 2012-01-10 01:06:53

+0

我正在思考一个缩小工具或宏预处理器的线条。你需要处理多少个xyz?而且,如果只有部分内容将在任何给定页面上执行,将所有这些内容放在一个文件中是否最好? – 2012-01-10 01:28:49

+0

那么,这个想法是,根据页面和上下文,我们有太多的文件加载。大约100个各种资源(包括css /图像)。所以,为了减少这个数字,我们试图将经常使用的一些文件组合起来。在这种情况下,一些是图书馆,一些是我们的内部代码。 直到这一点我们没有担心将功能XYZ(){}在全球范围内。使用新的组合文件,如果(false){function xyz(){}}在全局范围中结束,所以我们想到将它包装在var foo = function(){function xyz(){}}中; if(false){foo(); } – 2012-01-10 15:30:00

回答

2

您是否考虑过使用类似require.js的图书馆?有几个图书馆可以以更优雅的方式为你做这件事。

如果您不想使用依赖加载库,但使用jQuery或某些类似的库,则可以使用AJAX请求(在jQuery中使用script dataType)有条件地加载脚本。这比简单的eval()好得多,但当你试图管理一系列依赖关系时,它的稳健性较差。

另一个选择,如果你想简单地串联的一切,是包中的每个文件的匿名函数,然后分配必要的元素到window对象,将它们放置在全球范围内:

(function(window) { 

    /* file 1 here */ 
    function xyz() { 
     // etc ... 
    } 
    /* end file 1 */ 

    // now selectively choose what you want to be 
    // in the global scope 
    window.xyz = xyz; 

}(window)); 

xyz(); 

然而,这需要更多的工作来确定您希望在全球范围内提供的服务。请注意,必须注意将window作为参数传递给匿名函数,但如果要多次引用它,这不是一个坏主意(这会加速引用并允许在代码期间进行可变名称的搜索)压缩)。

+0

这是如果我们编写所有从一开始的代码,但同样问题的主要焦点是,是否可以明确地把一个嵌套函数在全球范围内一个很好的解决方案。 – 2012-01-10 15:35:00

+0

啊,我明白了。请参阅我的编辑 - 我认为这解决了你要做的事情。 – nrabinowitz 2012-01-10 20:58:09

+0

谢谢。 [这似乎工作](http://jsfiddle.net/y9D7E/)。从我所知道的情况来看,我认为这是我们最好的选择。我可以忍受这一点,但我真的希望有一些聪明的包装。你可以看到我希望能够做些什么(function(){function xyz(){}})。apply(window,[]);作为一个偷偷摸摸的解决方案。 – 2012-01-11 06:35:24

相关问题