【问题标题】:What is the technical limitation for a declaration to return value of it's variable?声明返回其变量值的技术限制是什么?
【发布时间】:2018-01-05 18:04:05
【问题描述】:

为什么声明返回未定义?他们有什么技术原因吗?

如果声明返回其变量的值,一个好处是我可以编写如下内容:

while((var next = generator.next())) doSomething(next);

由于规范,我需要在它不属于的范围内声明下一个。

(注意:有没有更好的地方问这个问题?这个问题可能是有争议的,而不仅仅是技术问题。)

【问题讨论】:

  • 据我所知他们确实返回了值,否则你将无法做到a = b = c = 5
  • “由于规范,我需要在不属于它的范围内声明下一个。” 可以使用块范围,见Prevent JavaScript closure from inheriting scope
  • Balint 是分配,而不是声明。不幸的是,它们是不同的东西,这就造成了这个复杂的问题。

标签: javascript


【解决方案1】:

这个问题是Value returned by the assignment 的重复问题,虽然除了没有太多答案可以给出,因为它是这样指定的(多么令人失望)。 var 不是表达式的一部分。

但既然你问的是while 循环,我想提供这个替代方案:

for(let next; next = generator.next();) doSomething(next);

【讨论】:

  • var 甚至没有有意义作为表达式的一部分。无论如何,它都会被提升到函数范围内。
  • 但是大多数语言不会把它拿出来,它会是 for 循环范围的一部分。使用 Javascript,我们倾向于编写在其他语言中假设正确的代码,即使它在 JS 中毫无意义。它只是让代码更清晰,IMO。
  • 这个答案看起来比拥有 Guest271314 建议的块范围更好,即使它在技术上不会影响 for 循环中的变量。
  • @JasonMcCarrell,变量 is 作用于for 循环:will have its own instance 变量的每次迭代 will have its own instance
  • 你是对的,我的错。感谢您提供明确且得到充分支持的答案!
【解决方案2】:

我需要在它不属于的范围内声明下一个。

您可以使用块作用域来执行任务,其中先前定义的变量声明将保留在块作用域之外分配的原始值

const next = "abc";

const doSomething = prop => console.log(prop);

{
  let next = 10;
  while (next = --next) doSomething(next)
}

console.log(next); // `"abc"`

【讨论】:

  • 好点!有额外的花括号有点恶心,但这会完全解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多