2012-01-10 4 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

+0

Я также думаю о линиях мини-инструмента или макропроцессора. Сколько «xyz' вам нужно иметь дело? И, действительно ли лучшая идея поместить все это в один файл, если только часть его будет выполнена на любой заданной странице? –

+0

Ну, идея в том, что в зависимости от страницы и контекста у нас слишком много загрузки файлов. Где-то около 100 различных ресурсов (включая css/images). Поэтому, пытаясь сократить это число, мы пытаемся объединить некоторые файлы, которые часто используются. В этом случае некоторые из них являются библиотеками, а некоторые - нашим внутренним кодом. До этого момента мы не беспокоились о размещении функции xyz() {} в глобальном масштабе. С новым объединенным файлом if (false) {function xyz() {}} попадает в глобальную область видимости, поэтому мы вычислили ее в var foo = function() {function xyz() {}}; if (false) {foo(); } –

ответ

2

Считаете ли вы использование библиотеки, например, require.js? Есть несколько библиотек, которые могут сделать это для вас более элегантно.

Если вы не хотите библиотеку загрузки зависимостей, но используете jQuery или какую-либо подобную библиотеку, вы можете условно загрузить сценарии с использованием запроса AJAX (в jQuery вы должны использовать 0TTdataType). Это намного лучше, чем простой 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

Это хорошее решение, если мы пишем весь код с самого начала, но опять же основное внимание в этом вопросе состоит в том, что если можно явно разместить вложенную функцию в глобальной области. –

+0

А, я вижу. Пожалуйста, см. Мое редактирование - я думаю, это касается того, что вы собираетесь делать. – nrabinowitz

+0

Спасибо. [Это похоже на работу] (http://jsfiddle.net/y9D7E/). Из того, что я могу сказать, я думаю, что это лучшее, что мы получим. Я могу жить с этим, но я действительно надеялся на какую-то умную обертку. Вы можете видеть, как я хотел бы сделать что-то вроде функции (function() {function xyz() {}}). Apply (window, []); как подлый подход. –