考虑下面的代码:
<html><head></head>
<body>
<script type="text/javascript">
var outside_scope = "outside scope";
function f1() {
alert(outside_scope) ;
}
f1();
</script>
</body>
</html>
此代码的输出是警报框显示消息“范围外”。 但是,如果我稍微修改了代码:
<html><head></head>
<body>
<script type="text/javascript">
var outside_scope = "outside scope";
function f1() {
alert(outside_scope) ;
var outside_scope = "inside scope";
}
f1();
</script>
</body>
</html>
警告框显示消息“ 未定义 ”。 我可以理解的逻辑,如果它显示在这两种情况下“不确定”。 但是,这没有发生。 它仅显示在第二种情况下“不确定”。 为什么是这样?
在此先感谢您的帮助!
在第一种情况下,你的代码访问全局变量“outside_scope”,已被初始化为“范围之外”。
JavaScript有功能级别范围,所以在第二种情况下它访问的功能范围变量“outside_scope”,但它尚未在警告框时初始化。 因此,它显示未定义。
变量是受吊装 。 这意味着,无论在哪里的变量被放置在函数内的,它被移动到其被限定的范围的顶部。
例如:
var outside_scope = "outside scope";
function f1() {
alert(outside_scope) ;
var outside_scope = "inside scope";
}
f1();
得到的解释为:
var outside_scope = "outside scope";
function f1() {
var outside_scope; // is undefined
alert(outside_scope) ;
outside_scope = "inside scope";
}
f1();
正因为如此,和函数只范围的JavaScript有,建议在声明所有的变量函数的顶部 ,类似于会发生什么。
JavaScript有功能范围,不能阻止范围。
在第二种情况下,outside_scope的声明被吊起到函数的顶部(但分配是不是)。
这就是为什么JavaScript代码是更容易,如果你把你所有的变量声明了在函数的顶部读一个很好的例子。 你的第二个例子是等价于:
function f1() {
var outside_scope;
alert(outside_scope);
outside_scope = "inside scope";
}
并且你可能现在明白为什么你得到“未定义”。
在第二示例中的本地变量存在对于整个功能范围。 不要紧,你的警觉,它的存在对整个功能之后定义它。
然而,实际的分配不会发生,直到警报之后,因此用“不确定”。
这是一个有趣的案例。
在第一个例子中,你已经定义了一个“全球性”的变量。 它具有全球范围,因此是在用于执行的任何功能/对象访问。
在第二个例子中,你有“封锁”与功能范围变量全局变量,但由于它尚未在警报时初始化,则返回“未定义”。
我同意这不是最直观的怪癖,但它有一定道理。
这是由于一种叫做变量声明的吊装 。
基本上,JavaScript的分隔在两个变量声明 ,而不把你做声明的分配和提升实际申报的函数的顶部 :
var f1 = function () {
// some code
var counter = 0;
// some more code
}
var f2 = function () {
var counter; // initialized with undefined
// some code
counter = 0;
// some more code
}
在运行时, f1()
被翻译成f2()
我写了一个深入的博客文章关于这个在这里 。 我希望这可以帮助您了解您的代码会发生什么。
这也是原因, 建议在 JavaScript 中函数的顶部声明变量 。 它可以帮助你理解这些代码做什么,在运行时。
文章来源: Why does shadowed variable evaluate to undefined when defined in outside scope?