admin管理员组文章数量:1429676
I am playing around with some pointless logic to better understand ES6 and have noticed a strange occurrence when defining a constant.
It seems possible to change a constant assignment when defined in a loop:
"use strict";
for(const i=0;i<10;i++){ //seting constant in loop
console.log(i); //is reassigned and incremented 0,1,2,3...
}
const e = 0; //setting constant outside loop
for(;e<10;e++){ //cannot reassign constant
console.log(e);
}
Is this expected behavior and can anyone shed some light on why this occurs, is declaration in the loop different?
Update from Statements/const
This declaration creates a constant that can be global or local to the function in which it is declared. Constants are block-scoped.
I am playing around with some pointless logic to better understand ES6 and have noticed a strange occurrence when defining a constant.
It seems possible to change a constant assignment when defined in a loop:
"use strict";
for(const i=0;i<10;i++){ //seting constant in loop
console.log(i); //is reassigned and incremented 0,1,2,3...
}
const e = 0; //setting constant outside loop
for(;e<10;e++){ //cannot reassign constant
console.log(e);
}
Is this expected behavior and can anyone shed some light on why this occurs, is declaration in the loop different?
Update from Statements/const
Share Improve this question edited Feb 5, 2015 at 14:48 Simon Staton asked Feb 5, 2015 at 12:46 Simon StatonSimon Staton 4,5054 gold badges31 silver badges50 bronze badges 4This declaration creates a constant that can be global or local to the function in which it is declared. Constants are block-scoped.
- 1 Wow, just tried this on Chrome Version 40.0.2214.94 and it generates an infinite loop, maybe because the constant is never muted. Which browser are you using? – Sarcadass Commented Feb 5, 2015 at 12:51
-
That problably means chrome has it correct by not reassigning it(? but should probably throw an error) and still hoists the constant. In your case it seems like the
const
acts likelet
developer.mozilla/en-US/docs/Web/JavaScript/Reference/… – René Commented Feb 5, 2015 at 13:08 -
In Firefox I get
TypeError: redeclaration of var i
for the first example – kapex Commented Feb 5, 2015 at 13:14 -
@BenjaminBlonde I am using canary v42, if you include
"use strict";
it will not create the infinite loop and will increment – Simon Staton Commented Feb 5, 2015 at 13:53
1 Answer
Reset to default 8When you modify an "immutable binding", the current draft only throws in the strict mode:
As @kangax pointed out, reassignment of a constant should always throw, since const
creates an "immutable binding" with the strict
flag on (here):
If IsConstantDeclaration of d is true, then
Call env’s CreateImmutableBinding concrete method passing dn and true as the arguments.
and then:
SetMutableBinding (N,V,S) ...
- Else if the binding for N in envRec is a mutable binding, change its bound value to V.
- Else this must be an attempt to change the value of an immutable binding so if S is true throw a TypeError exception.
However, node only throws in strict mode:
"use strict";
const e = 0;
e = 42; // SyntaxError: Assignment to constant variable.
(it's not clear why this is a "SyntaxError")...
In the non-strict mode, the assignment to the constant is silently ignored:
const e = 0;
e = 42;
console.log(e); // 0
Tested with node v0.10.35 with --harmony
flag.
本文标签: javascriptES6 why can I reassign a constant when defined in a loopStack Overflow
版权声明:本文标题:javascript - ES6 why can I reassign a constant when defined in a loop - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745468710a2659649.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论