【问题标题】:why semicolon must be added in the scene of the `yield`为什么必须在`yield`的场景中添加分号
【发布时间】:2017-09-15 13:16:39
【问题描述】:

我在下面写了一个演示来演示这个问题。

我希望生成器会为变量a 进行迭代,但是,冗余代码会影响它。

谁能一步一步弄清楚为什么会发生这种情况?

我的代码是:

function* foo(){
    var a = 0, c
    while(a < 10){
        a += 1
        yield a //if the semicolon is added here, the final result is 1
        [c] = [101]

    }
}

var gen= foo()
console.log(gen.next().value) // [101]

【问题讨论】:

  • 添加分号将终止该语句。如果没有分号,Javascript 会执行下面的行,因此它会产生 a[c] = [101]
  • 这就是为什么你应该养成在 JS 中每个语句都用分号结束的习惯。
  • ...这是编写自己的分号的原因之一,而不是依靠内置的纠错机制(自动插入分号)为您完成。

标签: javascript ecmascript-6 generator


【解决方案1】:

如果加分号,代码其实是yield a; [c] = [101];

所以你yielda[c] = [101];块不会影响实际返回值。

否则,代码为yield a[c] = [101];,即[101]

function* foo(){
    var a = 0, c
    while(a < 10){
        a += 1
        yield a[c] = [101];

    }
}

var gen= foo()
console.log(gen.next().value) // [101]

【讨论】:

  • "...并且 [c] = [101]; 块实际上被忽略了" 仅当冗余存储被优化掉时。 [c] = [101] 是一个有效的语句(不是“块”),它是写c = 101 的一种迟钝的方式。它被忽略的唯一原因是如果 JavaScript 引擎注意到 c 从未使用过。
  • @T.J.Crowder 是不是 yield 会导致实际跳过该语句?
  • @Dekel,如果您再次调用该函数,则不会。
  • @Dekel:嗯,它会发生的次数与达到该语句的次数一样多;代码只是没有运行生成器完成。示例:jsfiddle.net/2yj215jz/2
  • 它被调用的次数会比你调用它的次数少1。这是生成器的全部意义,如果它在下一个 next.. 中停止,它将继续
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多