Javascript: лучший способ объявить функции, которые будут использоваться во всем мире?

Мой javascript файл становится довольно большим (3000+ строк), и я смущаюсь о том, как настроить мои файлы и функции delare, чтобы они могли вызывать в любом месте файла.

Подводя итог моему JS файлу, на данный момент немного похоже:

//ALL GLOBAL VARIABLES FIRST DECLARED HERE
var var1 , var2 ,var3

$(document).ready(function(){

//JQUERY STUFF

});

//ALL FUNCTIONS THAT NEED TO BE GLOBAL DECLARED HERE
function myFunction(){
//do some stuff here
}

У меня возникают проблемы с этим, так как некоторые функции, которые я вызываю в местах, как представляется, не объявляются во время вызова или недоступны для globaly. Все это сейчас очень запутанно!

Может ли кто-нибудь предложить лучший способ компоновки большого файла js/jquery с определенными функциями JS, объектами и переменными, доступными для ссылки в любом месте файла.

UPDATE:

Итак, чтобы упростить это правильно (см. мои комментарии)?

window.MainModule = (function($, win, doc, undefined) {//WHAT IS BEING PASSED IN HERE?
    var foo, bar, modules; //VARIABLES ACCESSIBLE ANYWHERE

    var modules["foobar"] = (function() {//WHAT IS A MODULE? WHEN WOULD I USE A SEPERATE MODULE?
        var someFunction = function() { ... };//DECLARING MY FUNCTIONS?

        ...

        return { 
            init: someFunction,//IS THIS WHERE I USE/BIND MY FUNCTIONS TO EVENTS AND ELEMENTS?
            ... 
        };
    }());

    // hoist a variable into global scope
    window.Global = someLocal;

    return { 
        init: function() {//FUNCTION TO INIT ALL MODULES?
            for (var key in modules) {
                modules[key].init();
            }
        }
    };
}(jQuery, this, document));

Ответы

Ответ 1

Раздел модулей не определен правильно... вот немного приведённый пример.

window.MainModule = (function($, win, doc, undefined) {
    var modules = {};

    // -- Create as many modules as you need ...
    modules["alerter"] = (function(){
        var someFunction = function(){ alert('I alert first'); };

        return { 
            init: someFunction
        };
    }());

    modules["alerter2"] = (function(){
        var someFunction = function(){ alert('I alert second'); };

        return { 
            init: someFunction
        };
    }());

    return { 
        init: function(){
            for (var key in modules){
                modules[key].init();
            }
        }
    };
}(jQuery, this, document));

$(window.MainModule.init);

Ответ 2

// We always use closures don't we?
window.MainModule = (function($, win, doc, undefined) {
    var foo, bar, modules; // List of local variables. 

    var modules["foobar"] = (function() {
        var someFunction = function() { ... };

        ...

        return { 
            init: someFunction,
            ... 
        };
    }());

    // hoist a variable into global scope
    window.Global = someLocal;

    return { 
        init: function() {
            for (var key in modules) {
                modules[key].init();
            }
        }
    };
}(jQuery, this, document));

// Let kick off the MainModule on $.ready
// I recommend you do this in your `html` with page specific data.
$(window.MainModule.init);

[[Отказ от ответственности]]. Это модуль псевдокода с некоторым стандартным кодом, исключенным для краткости.

Все, что объявлено с помощью var x внутри вашего основного закрытия, доступно во всей функции. Конечно, он не будет настроен на то, что вы ожидаете от него, если вы не установите его.

Чтобы контролировать загрузку и разделение кода разделения на то, что автоматически выполняется в вашем закрытии, и что нужно вручную inited вашим контроллером с параметрами страницы/пользователя.

Ответ 3

Вы можете объявить их в области "Окно":

window.variableName = myVariable;

или вы можете опустить var, что является тем же самым, что и объявление в области окна:

variableName = myVariable;