【问题标题】:Changing the scope of "let" declaration改变“let”声明的范围
【发布时间】:2020-12-17 16:50:28
【问题描述】:

我想多次运行一个脚本,我不知道它是否是第一次运行-所以我不得不问,如果是,我会声明它:

if (typeof variable == undefined) { let variable = new Set(); }

不幸的是 1.) 一直用let variable; 重新声明会引发错误 2.) 这个变量只存在于“if”范围内 3.) 命令“let”需要一个完整的块,如果,三元或“无括号如果”抛出错误

我可以更改变量的范围吗?就像以前的 var 一样 - 我对此没有任何问题,我只想使用 Set (也是一个很好的讲座,知道它是否可能) 也许一些“如果未声明就声明”命令?

【问题讨论】:

  • 单个脚本在顶层运行代码两次,而且不知道它之前是否运行过,这很奇怪。如果必须这样做,请分配给全局对象,而不是使用let(或var
  • 我同意@CertainPerformance - 这有点代码味道,但如果有必要分配给全局对象可能会更好。如果由于某种原因 that 是不可能的或不可取的,您也可以只声明 if 块的 let outside 并仅在 if 块中分配.哪个,既然我输入了那个,你是如何在声明之前在if 条件中询问typeofvariable 的?这似乎应该引发错误......我认为您的代码中可能存在更大的结构问题。你不应该需要varlet 应该足够了。
  • 如何全局申报?对我来说还好。当然,如果我使用单个 let variable; 启动脚本运行,它将正常工作。如果那是你想说的话。 if typeof 也可以使用任何变量为我工作,现在在控制台中自己尝试一下。这只是个人的 10 行代码,没什么大不了的(收集链接并记住它)。

标签: typescript declare let redeclaration


【解决方案1】:

我不确定你到底想做什么。 代码是否在浏览器中运行?

如果是这样,您可以尝试省略 var/let/const 关键字:

if (typeof variable == undefined)  { variable = new Set(); }

如果窗口对象不存在,这将在窗口对象中创建一个变量

[编辑]: 当然,您可以通过明确说明全局变量来自的对象来使其“更好”。

对于浏览器,此代码将变为:

if (typeof window.variable == undefined)  { window.variable = new Set(); }

如果您在一个团队中工作,这个解决方案会更好,但如果您刚刚开始或尝试学习,两者都可以。

【讨论】:

  • 这接近于 cmets 中的推荐值。但是,为什么不具体,只做if( typeof window.variable === undefined) { window.variable = new Set(); }?大多数 linter 不喜欢你使用未声明的变量,在严格模式下也不可接受。此外,缩短条件本身并将其简单地写为if (!window.variable) { window.variable = new Set(); } 可能是可以接受的
  • 是的!这是有效的!哇,这就是他们所说的“全球”,很好!谢谢。对于这些特殊的 TS 类型,我认为“让”是强制性的。使用 window 是一样的,当然,在某些时候会更好。所以,为了知识:你不能设置 let 的范围吗?像……例如。一个函数,if在哪里,你希望“if”中的“let”在“function”的-s范围内!? (嗯..可能只有 Alex 的伎俩:使用对象.....)
  • 你不能改变 let 的范围。我永远是第一个大括号{}。所以 if/function/for 循环等会有一个单独的变量。
【解决方案2】:

您可以简单地先声明变量,然后对其进行操作。

let variable; // declare variable 

if (typeof variable === 'undefined') { variable = new Set(); }

它不应该抛出你提到的任何错误。

【讨论】:

  • 啊...是的,这不会抛出错误,但它没有任何意义,因为变量将被重新声明,并且将是未定义的,因此 if 语句将始终为真
  • @cncDAni3 这取决于你之前的逻辑,如果条件你可能会执行任何其他逻辑等,但最好的方法是始终声明一个具有默认值的变量,我不知道你想做什么,但那是标准方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2016-10-21
  • 2012-06-11
  • 1970-01-01
  • 2020-03-18
相关资源
最近更新 更多