Проблемы к которым приводят глобальные переменные

К примеру у вас есть такой модуль в файле toolbar.js:

var toolbarModule = {
    toolbar: undefined,
    initToolbar: function (cell) {
        toolbarModule.toolbar = createToolbar();
    }
};

Используете вы этот модуль просто подключением файла toolbar.js.

toolbarModule.initToolbar(c);

Главный минус этого кода в том, что если вам понадобится еще один тулбар (например, для другого таба), то оба они будут делить переменную toolbarModule.toolbar и произойдет коллизия.

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

Вариант с классами это по сути те же самые глобальные переменные только в рамках класса. Если использовать функции, то оверхедом будет увеличение количества параметров функции. 

Мне больше нравится функциональный подход, когда "весь мир" передается в функцию. Классы как структуры больше подходят для хранения данных. Хотя с другой стороны, если функция использует другие функции, то проще их объединить в класс.