在外面范围定义时为什么阴影变量评估为未定义?(Why does shadowed variable

2019-07-21 04:57发布

考虑下面的代码:

<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> 

警告框显示消息“ 未定义 ”。 我可以理解的逻辑,如果它显示在这两种情况下“不确定”。 但是,这没有发生。 它仅显示在第二种情况下“不确定”。 为什么是这样?

在此先感谢您的帮助!

Answer 1:

在第一种情况下,你的代码访问全局变量“outside_scope”,已被初始化为“范围之外”。

JavaScript有功能级别范围,所以在第二种情况下它访问的功能范围变量“outside_scope”,但它尚未在警告框时初始化。 因此,它显示未定义。



Answer 2:

变量是受吊装 。 这意味着,无论在哪里的变量被放置在函数内的,它被移动到其被限定的范围的顶部。

例如:

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有,建议在声明所有的变量函数的顶部 ,类似于会发生什么。



Answer 3:

JavaScript有功能范围,不能阻止范围。

在第二种情况下,outside_scope的声明被吊起到函数的顶部(但分配是不是)。

这就是为什么JavaScript代码是更容易,如果你把你所有的变量声明了在函数的顶部读一个很好的例子。 你的第二个例子是等价于:

function f1() {
    var outside_scope;
    alert(outside_scope);
    outside_scope = "inside scope";
}

并且你可能现在明白为什么你得到“未定义”。



Answer 4:

在第二示例中的本地变量存在对于整个功能范围。 不要紧,你的警觉,它的存在对整个功能之后定义它。

然而,实际的分配不会发生,直到警报之后,因此用“不确定”。



Answer 5:

这是一个有趣的案例。

在第一个例子中,你已经定义了一个“全球性”的变量。 它具有全球范围,因此是在用于执行的任何功能/对象访问。

在第二个例子中,你有“封锁”与功能范围变量全局变量,但由于它尚未在警报时初始化,则返回“未定义”。

我同意这不是最直观的怪癖,但它有一定道理。



Answer 6:

这是由于一种叫做变量声明的吊装

基本上,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?