【问题标题】:Why the value of const changes when using generators? [duplicate]为什么使用生成器时 const 的值会发生变化? [复制]
【发布时间】:2020-01-06 05:48:55
【问题描述】:

我一直在探索 Javascript 生成器,这没有问题,但我怀疑生成器是如何改变 'const' 的值的。据我所知,如果一个变量被声明为 const,它就不能被改变。

<script> 
function * numbers(i=0) 
{ 
    while(true){
        yield ++i;
    }

} 
const num = numbers(5);  ///// no error


console.log(num.next().value); 
console.log(num.next().value); 
console.log(num.next().value); 
</script>
output 
6 
7
8

【问题讨论】:

  • 因为生成器函数返回一个generator对象,所以即使变量是用const定义的,对象的内部值也可以改变
  • 你也可以阅读Generator object这个generator function
  • num 不会更改为其他值?但当然,调用.next() 可以在连续调用时返回不同的内容。

标签: javascript ecmascript-6 generator


【解决方案1】:

如果一个变量被声明为 const,它就不能被改变。

所指的东西不能改变,它不控制函数的返回值或对象的可变性。

在这种特定情况下,const num = numbers(5) 将生成器 object 分配给 num,现在 num 将始终引用同一个生成器对象,但这就是 const 控制结束的地方 - 只要你开始深入研究nums 属性(next() 方法)您已经留下了初始引用,现在您正在使用不同的引用(num 对象上的next 方法),它返回另一个完全独立的对象一个属性value - 与原始引用相距三个引用。

即使放弃所有中间对象,const 仍然无法控制函数的返回值:

let i = 0;

const foo = () => i ++;

foo(); // 0
foo(); // 1
foo(); // 2

const 是关于赋值的,它只会阻止这个:

const foo = () => i ++;

const foo = () => 0;

// SyntaxError: Identifier 'foo' has already been declared

生成器在这方面没有什么不同,它们只是有一些特殊的内部流控制。

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多