Можно ли разместить вложенную функцию в глобальной области видимости Javascript? - PullRequest
1 голос
/ 10 января 2012

У меня есть ситуация, когда я пытаюсь объединить несколько файлов Javascript в один и условно применить их.Я не хочу изменять реальные файлы.Есть ли способ, которым я могу обернуть эти файлы и вызывать их по требованию?

Суть в том, что в некоторых из этих файлов есть функция xyz () {}.Таким образом, оборачивая их if (false) {function xyz () {}} делает плохие вещи.

Например, если это мой код ...

if (includeFile) {
    /* The file */
    function foo() {}
    /* The file */
}

ПроблемаПолучается, что Chrome увидит foo () и поместит его в глобальную область , даже если includeFile равен false .

Простым решением было бы изменить его на var foo = function () {} но я не могу изменить эти файлы.

У меня также есть общее беспокойство по поводу запуска eval () для этих функций, так как они довольно большие.(Представьте, что jQuery заключен в функцию. Если это не проблема, возможно, eval является ответом?)

Я надеялся, что смогу вложить функции и передать окно в качестве области видимости, но попробовал этона jsFiddle, и это, похоже, не работает .

(function() {
    function foo() {
        alert('it works');
    }
}).apply(window, []);

foo();

Есть несколько похожих вопросов .Но никто не обращался к той же ситуации, что и я.Спасибо.

1 Ответ

2 голосов
/ 10 января 2012

Рассматривали ли вы использование такой библиотеки, как 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 в качестве аргумента анонимной функции, но это неплохая идея, если вы будете ссылаться на нее несколько раз (это ускоряет ссылки и допускает изменение имени переменной).во время сжатия кода).

...