我想到了三种不同的技术,每种技术都有其警告和(第二个除外)用途:
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;