На ум приходят три различных метода, каждый со своими предупреждениями и (кроме второго) использует:
1) Вы можете объявить новую переменную в JavaScript в любом месте кода, используя ключевое слово var
:
var $color = 'red';
На самом деле переменная определяется в пределах области действия, в которой находится var
, даже выше оператора var
, то есть эти две функции идентичны, даже если онивыглядят немного иначе:
function foo() {
doSomething();
var x = 5;
x += doSomethingElse();
return x;
}
function foo() {
var x;
doSomething();
x = 5;
x += doSomethingElse();
return x;
}
Это потому, что все var
вступают в силу при создании контекста для функции, а не там, где они появляются в коде.Дополнительно: Плохо, неправильно понято var
2) Если вы просто назначите свободный символ, который нигде не был объявлен, вы создадите неявную глобальную переменную(не ограниченный текущей областью), что, как правило, плохая идея.Подробнее: Ужас неявных глобалов
3) Еще одна вещь, которую вы можете сделать, это иметь объект, который является контейнером для различных переменных, которые вы хотите отслеживать.Вы можете создать новые свойства для объекта, просто назначив их:
var data = {}; // A blank object
data.foo = "bar"; // Now `data` has a `foo` property
Этот метод особенно удобен, когда вам нужно отслеживать данные, о которых ваш скрипт совершенно не знает, например, на основе пользовательского ввода, потому что выможно использовать либо точечную нотацию и литерал, как указано выше (data.foo
), либо вы можете использовать нотацию в скобках и строку (data["foo"]
).В последнем случае строка может быть результатом любого выражения, поэтому все они создают свойство foo
для data
:
// Dotted notation with a literal
data.foo = 42;
// Bracketed notation with a literal string
data["foo"] = 42;
// Bracketed notation with a string coming from a variable
s = "foo";
data[s] = 42;
// Bracketed notation with a string coming from an expression
s = "o";
data["f" + s + s] = 42;