Итак, у вас есть три основных варианта:
- Вы хотите выставить настройки как глобальную переменную и получить к ней доступ из ваших функций,
- Вы хотите скрыть настройки как детали реализации и получить к ним доступ в своих функциях,
- Вы хотите дать возможность предоставлять различные объекты настроек для разных функций.
Подход глобальной переменной
Ну, я думаю, это немного похоже на любую глобальную переменную. Если настройки одноэлементные (например, они описывают ваше приложение) и вы не видите никакой выгоды в возможности вызова одной и той же функции с различными объектами настроек, то я не понимаю, почему она не может быть глобальной переменной .
Тем не менее, из-за всех конфликтов имен, в Javascript хорошо "пространством имен" всех глобальных переменных. Таким образом, вместо глобальных переменных foo
и bar
вы должны иметь одну глобальную переменную MyGlobalNamespace
, которая представляет собой объекты с атрибутами: MyGlobalNamespace.foo
и MyGlobalNamespace.bar
.
Частный переменный подход
Наличие закрытой переменной, доступ к которой осуществляется с помощью замыкания, является хорошим шаблоном для скрытия деталей реализации. Если объект настроек - это то, что вы не хотите предоставлять в виде API, это, вероятно, правильный выбор.
Подход с использованием дополнительных функциональных параметров
В основном, если вы видите выгоду от возможности предоставления разных настроек для разных вызовов функций. Или, может быть, если вы можете представить себе такой выигрыш в будущем. Очевидный выбор, если у вас много экземпляров настроек в вашем приложении.
EDIT
По вопросу из комментариев:
Пример 1)
var blah = 123;
function fizbuzz() {
console.log(blah); // <-- This is an example of a closure accessing
// a variable
console.log(this.blah); // <-- Most likely makes no sense. It might work,
// because by default this will be set to a global
// object named window, but this is probably not
// what you want. In other situations this might
// point to another object.
}
Пример 2)
var obj = {
blah: 123,
fizbuzz: function() {
console.log(this.blah); // <-- This is *NOT* an example of a closure
// accessing a private variable. It's rather the
// closest Javascript can get to accessing an
// instance variable by a method, though this
// terminology shouldn't be used.
console.log(blah); // <-- This MAKES NO SENSE, there is no variable blah
// accessible from here.
}
};
Вкратце, я бы посоветовал вам прочитать хорошую книгу о фундаментальных концепциях Javascript. У него есть свои особенности, и их приятно знать.