5

我在玩一些代码,遇到了一种情况,我无法确定为什么“let”会这样做。

对于以下代码块:

var x=20;//全球范围函数f(){设x=x|30;}f();//VM3426:1未捕获引用错误:x未定义(…)

执行f()时出现错误“x is not defined”。我确实理解“let”变量没有被提升,但既然“x”有全局副本,为什么函数“f”内的行不默认为全局副本,而不是抛出错误?在函数的开头,“let”是否将变量设置为未声明(而不是因为提升而使用var“undefined”)?有没有办法在函数中获取“x”的全局副本?

2

4个答案4

重置为默认值
5

例外是关于右侧 x个-当您初始化块作用域时x个变量全局变量已被“遗忘”,但新变量仍未声明,无法在初始化期间使用

与显式调用全局比较

函数f(){设x=window.x|30;}

也可以看看这篇MDN文章关于死区

4
  • 1
    所以你要说的是这一部分让x首先计算局部变量x个创建但不声明(以便全局x被隐藏),然后执行此部分x||30x个找不到? 评论 2016年11月10日10:57
  • 没错,就是这样 评论 2016年11月10日11:15
  • 谢谢,我想知道这个过程是怎样的已创建但未声明被称为 评论 2016年11月10日11:21
  • 我希望全局名称从范围中被删除-还没有创建任何内容 评论 2016年11月10日14:03
0

允许您声明在其上使用的块、语句或表达式的范围内受限的变量。这与无功功率,无功功率关键字,它全局定义变量,或局部定义整个函数的变量,而不管块范围如何。

在您的示例中,由于您使用相同的名称定义let,因此会引发异常。

更多信息

1
  • 这应该不是问题,在函数内部应该使用x、 在外部无功功率,无功功率 评论 2016年11月10日9:32
0

可以使用此关键字访问全局范围

var x=20;//全球范围函数f(){设x=this.x|30;}f();

但在严格模式下,这将默认为未定义

读一读https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this

0

局部x的声明将隐藏全局x,而新的x仍然没有首先声明,因此无法在初始化期间使用。情况相同,如下所示:

var foo=5;函数do_something(){console.log(foo);//引用错误设foo=2;}做某事();

供参考MDN公司

根据@m.antkowicz的建议,您可以使用窗口。x个在你的情况下。

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.