据我所知,const
的范围是花括号(块)。但是,当我在浏览器(FF)中运行以下代码时,它不会给出任何错误。以下JS代码是对的吗?请解释一下。
<script type="text/javascript">
{
const Foo = "foo";
}
</script>
<div></div>
<script type="text/javascript">
{
Foo = null;
}
</script>
答案 0 :(得分:5)
你不会得到错误,因为
下面的代码说你在这个代码块中使用Foo
的const变量,const Foo
将可以在块的一侧访问
{
const Foo = "foo";
}
下面的代码说明您正在为变量Foo
分配值null
,它将绑定到window
对象,
{
Foo = null;
}
所以绑定到Foo = null;
对象的window
和const 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。当为变量赋值时,引擎总是检查变量名是否在当前执行中没有绑定上下文。简而言之,它会检查
Foo
:答案为否。您的Foo = "foo"
仅为范围A所知。不在当前范围内。Foo
:答案是否定的。父范围内没有声明。Foo
:答案为否。最终结果:将进行分配。但由于您没有提供任何作业声明:const
,let
或var
。因此,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>
你怎么看?
...
有效。你不相信我:请在下面查看:
{
window.Foo = 'hello world';
console.log('window.Foo?', window.Foo); // shows hello world
{
Foo = 555;
console.log('window.Foo?', window.Foo); // shows 555
}
}
&#13;
这是因为向窗口范围添加变量(尽管不建议这样做)并不会使其成为只读。您可以根据需要随后进行更改。