JavaScript const范围和花括号

时间:2018-03-12 07:15:30

标签: javascript html

据我所知,const的范围是花括号(块)。但是,当我在浏览器(FF)中运行以下代码时,它不会给出任何错误。以下JS代码是对的吗?请解释一下。

 <script type="text/javascript">
 {
     const Foo = "foo";        
 }
 </script>
 <div></div>
 <script type="text/javascript">
 {
     Foo = null;
 }
 </script>

2 个答案:

答案 0 :(得分:5)

你不会得到错误,因为

下面的代码说你在这个代码块中使用Foo的const变量,const Foo将可以在块的一侧访问

 {
     const Foo = "foo";        
 }

下面的代码说明您正在为变量Foo分配值null,它将绑定到window对象,

 {
    Foo = null;
 }

所以绑定到Foo = null;对象的windowconst Foo='foo'是特定代码块的常量变量

因此,当您分配Foo=null时,它会将变量分配给window对象,您可以像

一样访问它
  window.Foo

即。声明没有var的任何变量都将绑定到window对象,

答案 1 :(得分:2)

您知道使用const将在给定范围内创建常量。看看你的例子:

<script type="text/javascript">
{
   const Foo = "foo";        
}
</script>
<div></div>
<script type="text/javascript">
{
   Foo = null;
}
</script>

您可以将上述代码缩减为以下代码:

{
   const Foo = "foo";        
}
{
   Foo = null;
}

由于您已在范围中声明并初始化Foo(使用{}表示),因此Foo仅已知该范围。让我们调用范围A.当发出Foo = null;时,你处于不同的范围:B。当为变量赋值时,引擎总是检查变量名是否在当前执行中没有绑定上下文。简而言之,它会检查

  1. 如果本地范围中存在Foo:答案为否。您的Foo = "foo"仅为范围A所知。不在当前范围内。
  2. 如果范围链中存在Foo :答案是否定的。父范围内没有声明。
  3. 如果{strong>全局执行上下文(又称窗口范围)已知Foo:答案为否。
  4. 最终结果:将进行分配。但由于您没有提供任何作业声明:constletvar。因此,Foo=null将添加到窗口范围。如果您window.Foo,则会收到null的回复。

    但是,必须注意应该有错误。但是,Javascript是一种“服务”的语言。开发者。它不会向您发送错误,而是将该错误静音并将Foo挂钩到窗口对象。如果您使用strict mode,则会抛出错误。 (有关详细信息,请参阅MDN页面)

    为了更好地理解它,请查看在非严格环境中执行的以下示例,并首先考虑是否存在错误。

    <script type="text/javascript">
    {
         const Foo = 'hello';
         Foo = 555; // success or fail ?
    }
    </script>
    

    答案是否定的。你知道这一点。第一次检查失败:Foo已绑定在同一范围内。

    <script type="text/javascript">
    {
         const Foo = 'hello';
         {
            Foo = 555; // success or fail ?
         }
    }
    </script>
    

    答案是肯定的。它将失败,因为它未通过第二次检查(参见上面的列表)。在范围中调用Foo = 555;:B。范围B具有父范围:A Foo已知。

    现在,有些棘手:

    <script type="text/javascript">
        {
            window.Foo = 'hello';
            {
                Foo = 555; // success or fail ?
            }
        }
    </script>
    
    你怎么看?

    ...

    有效。你不相信我:请在下面查看:

    &#13;
    &#13;
    {
      window.Foo = 'hello world';
      console.log('window.Foo?', window.Foo); // shows hello world
      {
        Foo = 555;
        console.log('window.Foo?', window.Foo); // shows 555
      }
    }
    &#13;
    &#13;
    &#13;

    这是因为向窗口范围添加变量(尽管不建议这样做)并不会使其成为只读。您可以根据需要随后进行更改。