Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在使用生成器时const的值会发生变化?_Javascript_Ecmascript 6_Generator - Fatal编程技术网

Javascript 为什么在使用生成器时const的值会发生变化?

Javascript 为什么在使用生成器时const的值会发生变化?,javascript,ecmascript-6,generator,Javascript,Ecmascript 6,Generator,我一直在探索Javascript生成器,这没有问题,但我怀疑生成器是如何改变“const”的值的。据我所知,如果一个变量被声明为const,它就不能被更改 <script> function * numbers(i=0) { while(true){ yield ++i; } } const num = numbers(5); ///// no error console.log(num.next().value); console.

我一直在探索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>
如果变量声明为常量,则无法更改

<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>
它所指的内容不能更改,它不控制函数的返回值或对象的易变性

在这种特定情况下,
const num=numes(5)
将生成器对象分配给
num
,现在
num
将始终引用同一个生成器对象,但这就是const的控制结束的地方-只要您开始挖掘
num
的属性(
next()
方法)您已经保留了初始引用,现在您正在使用另一个引用(
num
对象上的
next
方法),该方法返回另一个具有属性
值的完全独立的对象,即与原始对象相隔三个引用

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

设i=0;
常量foo=()=>i++;
foo();//0
foo();//1.
foo();//2.
const是关于赋值的,它只防止以下情况:

constfoo=()=>i++;
常量foo=()=>0;
//SyntaxError:已声明标识符“foo”

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

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