例如,这是我的JavaScript代码:
var foo = 'Originalvalue';
var foo = 'Nextvalue';
alert(foo); // Nextvalue
那么,现在我确信在已经声明的变量前写var
只是简单地无效并且对程序没用。
但是考虑一下这个程序:
var foo = 'Originalvalue';
function duhfoo() {
var foo = 'Newbievalue';
}
duhfoo();
alert(foo); // Originalvalue
然后,根据我的第一个例子中解释的逻辑,值应该是'Originalvalue',因为已经有一个名为foo
的变量。那为什么会这样呢?
答案 0 :(得分:2)
duhfoo中的变量foo清楚地表明它的范围是duhfoo()方法而不是全局。
答案 1 :(得分:2)
答案 2 :(得分:2)
在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
捕获。