在Javascript中有两种变量:局部变量和全局变量。
在函数外部使用var
时,您声明了一个全局变量,如果您根本不使用,也会发生同样的情况var
。写作
foo = "first";
在顶层(任何函数之外)与var foo = "first"
.
然而,当在函数内部时,情况有所不同,关键字var
区分局部变量和全局变量:
var foo = "first";
var bar = "second";
function f()
{
var foo = "third"; // local
bar = "fourth"; // global
}
f();
alert([foo, bar]); // output will be first,fourth
换句话说,当您var
在函数内部使用时,该变量将是具有相同名称的不同变量,仅对写入函数边界内的代码可见。
请注意,边界由函数确定,而不是大括号{...}
。如果您有嵌套块并var
在块内使用另一个声明,则变量将是相同的,这与其他语言(如 Java、C 或 C++)中发生的情况不同。
创建作用域的唯一方法是定义一个函数(包括函数内部的函数)。
在 Javascript 中要记住的另一件非常重要的事情(特别是如果已经接触过类似的语言,其中不存在这个概念,如 Java、C 或 C++)是“捕获”/“关闭”的概念......
var foo = "first";
function f()
{
// Local variable
var foo = "second";
function g()
{
// This is the local foo of f, not the global
// one even if there is no "var" declaration
// inside this nested scope
return foo;
}
return g;
}
var nested_function = f();
alert([foo, nested_function()]); // output will be first,second
基本上,一个局部变量可以“超过”定义它的函数,通过被称为“捕获”该变量的其他函数使用。捕获一个或多个变量的函数称为“闭包”。
换句话说,局部变量仅在函数体内可见foo
,但它的寿命可能比函数长,就像上一个示例的局部变量一样,其中变量在返回后幸存下来,f
因为它已被闭包捕获g
。