Javascript 为什么必须在“yield”的场景中添加分号`

Javascript 为什么必须在“yield”的场景中添加分号`,javascript,ecmascript-6,generator,Javascript,Ecmascript 6,Generator,我在下面写了一个演示来演示这个问题 我希望生成器对变量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] } }

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

我希望生成器对变量
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]
函数*foo(){
变量a=0,c
而(a<10){
a+=1
产生一个//如果分号加在这里,最终结果是1
[c] =[101]
}
}
var gen=foo()
console.log(gen.next().value)//[101]

如果添加分号,代码实际上是
产生一个;[c] =[101]

所以你产生了
a
[c]=[101]块不会影响实际返回值

否则,代码是
产生a[c]=[101]
[101]

函数*foo(){
变量a=0,c
而(a<10){
a+=1
收益率a[c]=[101];
}
}
var gen=foo()

console.log(gen.next().value)/[101]
添加分号将终止该语句。在没有分号的情况下,Javascript会执行下面的一行,从而生成[c]=[101]这就是为什么您应该养成在JS中用分号结束每个语句的习惯……这是编写自己的分号的原因之一,而不是依赖内置的纠错机制(自动插入分号)来完成这项工作。“……和[c]=[101];块实际上被忽略“只有当冗余存储被优化掉时。
[c]=[101]
是有效的语句(不是“块”),这是一种写
c=101
的迟钝方式。它被忽略的唯一原因是如果JavaScript引擎注意到
c
从未被使用。@T.J.Crowder
yield
不是会导致该语句的实际跳过吗?@Dekel,如果你再次调用该函数就不会了。@Dekel:好吧,它的发生次数与该语句的次数一样多ached;代码只是没有运行生成器直到完成。示例:它的调用次数将比您调用它的次数少1次。这是生成器的一个要点,如果在下一个
下一个
中停止,它将继续运行。。