const dentro de escopos de bloco no Node e Chrome (V8)
Estou escrevendo um aplicativo nodejs (v4.2.4) onde encontrei algum comportamento estranho.
function A(number) {
this.number = number;
}
for(var i = 0; i < 3; i++) {
const a = new A(i);
console.log(a.number);
}
const b = new A(99);
console.log(b.number);
Minha intuição, vinda de Java (e a do FireFox), é que a saída deveria ter sido
0
1
2
99
No entanto, o Node (e o Chrome) me fornece
0
0
0
99
Eu investiguei e entendi deMSN - escopo de bloco estevar
não tem escopo de bloco em javascript. Olhando mais longe,MSN - const descreve uma declaração const como tendo escopo de bloco:
As constantes têm escopo de bloco, bem como variáveis definidas usando a instrução let. O valor de uma constante não pode mudar através da reatribuição e não pode ser redeclarado.
Nesse caso, eu diria que o Node e o Chrome (nesse caso provavelmente o V8), têm algum tipo de manipulação obscura deconst
em escopos de bloco. Mas eles também escrevem que
Esta declaração cria uma constante que pode ser global ou local para a função na qual é declarada.
Isso significa que o V8 coloca todos osconst
declaração como uma variável global enquanto o FireFox cria uma local? Como é possível que algo crucial como esse seja implementado de maneira tão diferente?